当前位置:编程学习 > JAVA >>

请教一个“线程池”的代码布局结构设计问题.....

高手,您好:
    我在写一个CS结构的im系统,最近我打算将“线程池”嵌入到我的系统中来..
    朋友给我了一个线程池的镜像例子:
      
    经过初步的研究,我知道:
    图片中的第4行代码的“exec = Executors.newCachedThreadPool();”的语句,是“创建一个具体类型的线程池的实体”.
    图片中的倒数第7行,是“在用于管理线程的线程池exec中启动线程t1”这个具体线程对象..
    弟我的im系统的结构是进行的如下定义:
    (S端部分源代码..) 
    

while (true) {
// 创建绑定到端口8888的ServerSocket对象
try {
so1 = ss1.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(so1 + "|||---");
System.out.println("服务器正在对8888端口进行监听");
// 服务器循环接受客户端的请求,为不同的客户端提供服务
System.out.println("进入try");
System.out.println("进入try1");
System.out.println("进入try2");
  buffertemp = Lib.readsocketUTF(so1);
System.out.print(buffertemp);
System.out.println("进入try3");
System.out.println("C_port_connect" + "I'm_Doctor_From_BeiJing");
System.out.println(buffertemp);
buffer = buffertemp.split("[#]");
System.out.println("S:" + buffer);
condition = Integer.parseInt(buffer[0]);
System.out.println("S:" + condition);
MyInfo = buffer[1];
System.out.println(MyInfo);
System.out.println("MyInfo:" + MyInfo);
MySysRole = buffer[2];
MyRole = buffer[3];
MySysNum = buffer[4]; switch (condition) {
case 0: {// 已对照完毕.
ManageTheChannel0ConfirmandSaveDS obj0 = new ManageTheChannel0ConfirmandSaveDS(
so1, this, MyInfo);
Thread m0 = new Thread(obj0, "MyThread1");
m0.start();
break;
}
case 1: {
Complete_ManageTheChannel1SendInfo m1 = new Complete_ManageTheChannel1SendInfo(
"Thread2", this, MyInfo);
m1.start();
break;
}
case 2: {// 已对照完毕.
ManageTheChannel2ExitSysGivOrderNum m2 = new ManageTheChannel2ExitSysGivOrderNum(
so1, "Thread3", MyInfo, this);
m2.start();
break;
}
                                        } 
                                        }

    高手,现在在经过了初步的学习后,我打算在我的S端的代码基础上,进行如下形式的“线程池的嵌入”:
    (S端的改造蓝图...红色代码为修改部分)
    

                ExecutorService exec = new Executors.newCachedThreadPool();
while (true) {
// 创建绑定到端口8888的ServerSocket对象
try {
so1 = ss1.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(so1 + "|||---");
System.out.println("服务器正在对8888端口进行监听");
// 服务器循环接受客户端的请求,为不同的客户端提供服务
System.out.println("进入try");
System.out.println("进入try1");
System.out.println("进入try2");
  buffertemp = Lib.readsocketUTF(so1);
System.out.print(buffertemp);
System.out.println("进入try3");
System.out.println("C_port_connect" + "I'm_Doctor_From_BeiJing");
System.out.println(buffertemp);
buffer = buffertemp.split("[#]");
System.out.println("S:" + buffer);
condition = Integer.parseInt(buffer[0]);
System.out.println("S:" + condition);
MyInfo = buffer[1];
System.out.println(MyInfo);
System.out.println("MyInfo:" + MyInfo);
MySysRole = buffer[2];
MyRole = buffer[3];
MySysNum = buffer[4]; switch (condition) {
case 0: {// 已对照完毕.
ManageTheChannel0ConfirmandSaveDS obj0 = new ManageTheChannel0ConfirmandSaveDS(
so1, this, MyInfo);
Thread m0 = new Thread(obj0, "MyThread1");
exec.execute(m0);
break;
}
case 1: {
Complete_ManageTheChannel1SendInfo m1 = new Complete_ManageTheChannel1SendInfo(
"Thread2", this, MyInfo);
exec.execute(m1);
                                                break;
}
case 2: {// 已对照完毕.
ManageTheChannel2ExitSysGivOrderNum m2 = new ManageTheChannel2ExitSysGivOrderNum(
so1, "Thread3", MyInfo, this);
exec.execute(m2);
break;
}
                                        }
                                        }

    希望得到高手的点拨:
    采用如上的“想法”进行弟我的项目的线程池的“嵌入”,是否能够达到:
    工程的线程池功能的添加..?
    谢谢高手!!
    一百分奉上!!
                                                           一位日日夜夜向着理想奔跑的筑梦者
                                                           2013年11月1日早晨5点24分 线程池 im 通信 Java SE 网络编程 --------------------编程问答-------------------- 高手,对不起,由于弟我第一次使用“字体颜色”功能,还不是很习惯..
    弟我的第二幅:“S端的改造蓝图”,他的被弟我修改后的代码,应该如下:
    分别为:
    第2行.
    第36行.
    第42行.
    第48行.
    希望能够得到高手“改造可行性”的回复.
    谢谢高手!! --------------------编程问答-------------------- 大概是这么个意思 --------------------编程问答-------------------- 端口监听这样直接用线程池不行吧,因为端口监听的时候线程会等待,只有有连接的时候才会继续 --------------------编程问答-------------------- 又看到你的帖子;

基本思路是没错的,线程模型是:主线程只负责accept,监听有没有新的请求,接收到请求以后交给其他的线程来处理业务,你的思路没错,但是我看你在交给其他线程之前还做了一些其他的处理,一般的业务线程直接定义为


Class Bussiness {
    Socket s;
    Bussiness(Socket s) {
        this.s = s;
    }
}


这样更加清晰,就是一个线程管监听,其他的处理业务。

当然这是比较老的线程模型了,现在一般都用NIO的思想来处理网络IO。 --------------------编程问答-------------------- 学习了,但是现在网上基本都是这种线程模型jdk1.5版本中线程池管理,ExecutorService是一个接口,继承executor接口。
POOL_SIZE单个cpu线程池的大小
runtime的availableProcessor()方法返回当前系统的cpu数目
executorservice = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessor()*POOL_SIZE);
executorservice.execute(new Handler(socket));Handler为多线程
本人nio思想学习中....
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,