我们先关注一下这个类的构造函数,然后再看它的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
查看本文来源