高手,您好:
    我在写一个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网络编程

解决方案 »

  1.   

    又看到你的帖子;基本思路是没错的,线程模型是:主线程只负责accept,监听有没有新的请求,接收到请求以后交给其他的线程来处理业务,你的思路没错,但是我看你在交给其他线程之前还做了一些其他的处理,一般的业务线程直接定义为
    Class Bussiness {
        Socket s;
        Bussiness(Socket s) {
            this.s = s;
        }
    }
    这样更加清晰,就是一个线程管监听,其他的处理业务。当然这是比较老的线程模型了,现在一般都用NIO的思想来处理网络IO。
      

  2.   

    学习了,但是现在网上基本都是这种线程模型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思想学习中....