100行Java代码构建一个线程池

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

100行Java代码构建一个线程池

本示例程序由三个类构成,第一个是TestThreadPool类,它是一个测试程序,用来模拟客户端的请求,当你运行它时,系统首先会显示线程池的初始化信息,然后提示你从键盘上输入字符串,并按下回车键,这时你会发现屏幕上显示信息,告诉你某个线程正在处理你的请求,如果你快速地输入一行行字符串,那么你会发现线程池中不断有线程被唤醒,来处理你的请求,在本例中,我创建了一个拥有10个线程的线程池,如果线程池中没有可用线程了,系统会提示你相应的警告信息,但如果你稍等片刻,那你会发现屏幕上会陆陆续续提示有线程进入了睡眠状态,这时你又可以发送新的请求了。

第二个类是ThreadPoolManager类,顾名思义,它是一个用于管理线程池的类,它的主要职责是初始化线程池,并为客户端的请求分配不同的线程来进行处理,如果线程池满了,它会对你发出警告信息。

最后一个类是SimpleThread类,它是Thread类的一个子类,它才真正对客户端的请求进行处理,SimpleThread在示例程序初始化时都处于睡眠状态,但如果它接受到了ThreadPoolManager类发过来的调度信息,则会将自己唤醒,并对请求进行处理。

首先我们来看一下TestThreadPool类的源码:

//TestThreadPool.java

1 import java.io.*;

2

3

4 public class TestThreadPool

5 {

6 public static void main(String[] args)

7 {

8 try{

9 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

10 String s;

11 ThreadPoolManager manager = new ThreadPoolManager(10);

12 while((s = br.readLine()) != null)

13 {

14 manager.process(s);

15 }

16 }catch(IOException e){}

17 }

18 }

由于此测试程序用到了输入输入类,因此第1行导入了JAVA的基本IO处理包,在第11行中,我们创建了一个名为manager的类,它给ThreadPoolManager类的构造函数传递了一个值为10的参数,告诉ThreadPoolManager类:我要一个有10个线程的池,给我创建一个吧!第12行至15行是一个无限循环,它用来等待用户的键入,并将键入的字符串保存在s变量中,并调用ThreadPoolManager类的process 方法来将这个请求进行处理。

下面我们再进一步跟踪到ThreadPoolManager类中去,以下是它的源代码:

//ThreadPoolManager.java

1 import java.util.*;

2

3

4 class ThreadPoolManager

5 {

6

7 private int maxThread;

8 public Vector vector;

9 public void setMaxThread(int threadCount)

10 {

11 maxThread = threadCount;

12 }

13

14 public ThreadPoolManager(int threadCount)

15 {

16 setMaxThread(threadCount);

17 System.out.println("Starting thread pool...");

18 vector = new Vector();

19 for(int i = 1; i <= 10; i++)

20 {

21 SimpleThread thread = new SimpleThread(i);

22 vector.addElement(thread);

23 thread.start();

24 }

25 }

26

27 public void process(String argument)

28 {

29 int i;

30 for(i = 0; i < vector.size(); i++)

31 {

32 SimpleThread currentThread = (SimpleThread)vector.elementAt(i);

33 if(!currentThread.isRunning())

34 {

35 System.out.println("Thread "+ (i+1) +" is processing:" +

argument);

36 currentThread.setArgument(argument);

37 currentThread.setRunning(true);

38 return;

39 }

40 }

41 if(i == vector.size())

42 {

43 System.out.println("pool is full, try in another time.");

44 }

45 }

46 }//end of class ThreadPoolManager

我们先关注一下这个类的构造函数,然后再看它的process()方法。第16-24行是它的构造函数,首先它给ThreadPoolManager类的成员变量maxThread赋值,maxThread表示用于控制线程池中最大线程的数量。第18行初始化一个数组vector,它用来存放所有的SimpleThread类,这时候就充分体现了JAVA语言的优越性与艺术性:如果你用C语言的话,至少要写100行以上的代码来完成vector的功能,而且C语言数组只能容纳类型统一的基本数据类型,无法容纳对象。好了,闲话少说,第19-24行的循环完成这样一个功能:先创建一个新的SimpleThread 类,然后将它放入vector中去,最后用thread.start()来启动这个线程,为什么要用

相关文档
最新文档