Java线程——线程池结合网络编程

来源:互联网 发布:淘宝网店装修视频教程 编辑:程序博客网 时间:2024/06/06 07:22

下面我们通过一个实际的应用案例来展示如何使用线程池。在我们编写基于Socket的服务器程序时,通常的做法是,每连接一个客户端,都为它创建一个新的线程,客户端离开后再销毁该线程。
在实际的应用中,面对大量的客户端,需要大量的、频繁的创建多个线程并销毁,对系统资源造成了很大的浪费。然而此时使用线程池技术是非常合适的,它可以大大减少线程的创建和销毁次数,提高服务器的工作效率。但如果线程要求的运行时间比较长,此时线程的运行时间比创建时间要长得多,单靠减少创建时间对系统效率的提高不明显,此时就不适合应用线程池技术,需要借助其他的技术来提高服务器的服务效率。
如下程序开发了一个基于Socket的服务端程序,服务器端程序的开发过程如下。
(1)创建一个容量为10的线程池。
(2)创建一个Serversocket服务端监听程序,监听端口为12345。
(3)使用while()开始监听客户端的连接,如果接收到客户端的连接accept(),则根据对客户端对象Socket创建一个独立线程来处理该客户端的事务,该线程从线程池中创建。
对于每一个客户端的处理线程,需要开发一个独立的类serviceThread,我们把它作为子类创建。

.由于要使用线程池,因此该类必须是线程类,实现Runnable接口即可。
.在它的构造函数中设置线程类处理的客户端Socket对象。
.在run()中,建立客户端的输入流和输出流的连接,使用while()循环来读取客户端的输入行,并回复给客户端。如果客户端输入bye命令,则关闭该客户端的连接。
完整的实现代码如下程序所示。

import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.IOException;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class TestThreadPool {    public static void main(String args[]) {        boolean flag = true;        try {            // 创建线程池            ExecutorService pool = Executors.newFixedThreadPool(10);            // 启动服务器            ServerSocket server = new ServerSocket(12345);            System.out.println("开始监听");            while (flag) {                // 接受客户端连接                Socket socket = server.accept();                // 为客户端创建一个独立线程                pool.execute(new ServiceThread(socket));            }            // 关闭            server.close();            pool.shutdown();        } catch (IOException e) {            e.printStackTrace();        }    }}class ServiceThread implements Runnable {    private Socket socket = null;    ServiceThread(Socket socket) {        this.socket = socket;    }    public void run() {        try {            // 客户端输入输出流            DataInputStream is = new DataInputStream(new BufferedInputStream(                    socket.getInputStream()));            OutputStream os = socket.getOutputStream();            // 读取客户端输入            String inputLine;            while ((inputLine = is.readLine()) != null) {                // 当客户端输入bye时关闭客户端连接                if (inputLine.equals("bye")) {                    break;                } else {                    System.out.println(inputLine);                    os.write(("reply: " + inputLine).getBytes());                }            }            is.close();            os.close();            socket.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

具体运行结果如下:
这里写图片描述
这里写图片描述

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 石家庄棉五小区拆迁 五小区 长沙小区 黄石小区 五室两厅装修效果图 五征奥驰1800驾驶室总成 五室两厅户型图大全 建筑五证 五尾狐 千年的狐歌曲 千年狐图片 小电梯五层楼多少钱 五层楼家用电梯多少钱 买了多层五楼后悔的 龙层花 五层龙 悠闲龙生 十九层深渊 五山 五岁庵 参岑白术散功效 先锋 岑寨散人 时运强人 岑寨散人 舞岛优理 手岛优 桐岛优介 五岩山景区旅游 五岩山 苍岩山 苍岩山风景区 苍岩山风景区旅游 白岩山景区 西岩山 穿岩山森林公园 苍岩山门票多少钱 苍岩山门票 翠岩山旅游 仓岩山旅游景点 岩山椒 黄岩松岩山景区 苍岩山门票多少钱2018 井陉 苍岩山