我们先关注一下这个类的构造函数,然后再看它的process()方法。第16-24行是它的构造函数,首先它给ThreadPoolManager类的成员变量maxThread赋值,maxThread表示用于控制线程池中最大线程的数量。第18行初始化一个数组vector,它用来存放所有的SimpleThread类,这时候就充分体现了JAVA语言的优越性与艺术性:如果你用C语言的话,至少要写100行以上的代码来完成vector的功能,而且C语言数组只能容纳类型统一的基本数据类型,无法容纳对象。好了,闲话少说,第19-24行的循环完成这样一个功能:先创建一个新的SimpleThread类,然后将它放入vector中去,最后用thread.start()来启动这个线程,为什么要用start()方法来启动线程呢?因为这是JAVA语言中所规定的,如果你不用的话,那这些线程将永远得不到激活,从而导致本示例程序根本无法运行。
下面我们再来看一下process()方法,第30-40行的循环依次从vector数组中选取SimpleThread线程,并检查它是否处于激活状态(所谓激活状态是指此线程是否正在处理客户端的请求),如果处于激活状态的话,那继续查找vector数组的下一项,如果vector数组中所有的线程都处于激活状态的话,那它会打印出一条信息,提示用户稍候再试。相反如果找到了一个睡眠线程的话,那第35-38行会对此进行处理,它先告诉客户端是哪一个线程来处理这个请求,然后将客户端的请求,即字符串argument转发给SimpleThread类的setArgument()方法进行处理,并调用SimpleThread类的setRunning()方法来唤醒当前线程,来对客户端请求进行处理。
可能你还对setRunning()方法是怎样唤醒线程的有些不明白,那我们现在就进入最后一个类:SimpleThread类,它的源代码如下:
| //SimpleThread.java 1 class SimpleThread extends Thread 2 { 3 private boolean runningFlag; 4 private String argument; 5 public boolean isRunning() 6 { 7 return runningFlag; 8 } 9 public synchronized void setRunning(boolean flag) 10 { 11 runningFlag = flag; 12 if(flag) 13 this.notify(); 14 } 15 16 public String getArgument() 17 { 18 return this.argument; 19 } 20 public void setArgument(String string) 21 { 22 argument = string; 23 } 24 25 public SimpleThread(int threadNumber) 26 { 27 runningFlag = false; 28 System.out.println("thread " + threadNumber + "started."); 29 } 30 31 public synchronized void run() 32 { 33 try{ 34 while(true) 35 { 36 if(!runningFlag) 37 { 38 this.wait(); 39 } 40 else 41 { 42 System.out.println("processing " + getArgument() + "... done."); 43 sleep(5000); 44 System.out.println("Thread is sleeping..."); 45 setRunning(false); 46 } 47 } 48 } catch(InterruptedException e){ 49 System.out.println("Interrupt"); 50 } 51 }//end of run() 52 }//end of class SimpleThread |

