服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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

ad_qqread_mid_big">
  下面我们再来看一下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

  如果你对java的线程编程有些不太明白的话,那我先在这里简单地讲解一下,java有一个名为thread的类,如果你要创建一个线程,则必须要从thread类中继承,并且还要实现thread类的run()接口,要激活一个线程,必须调用它的start()方法,start()方法会自动调用run()接口,因此用户必须在run()接口中写入自己的应用处理逻辑。那么我们怎么来控制线程的睡眠与唤醒呢?其实很简单,java语言为所有的对象都内置了wait()和notify()方法,当一个线程调用wait()方法时,则线程进入睡眠状态,就像停在了当前代码上了,也不会继续执行它以下的代码了,当调用notify()方法时,则会从调用wait()方法的那行代码继续执行以下的代码,这个过程有点像编译器中的断点调试的概念。以本程序为例,第38行调用了wait()方法,则这个线程就像凝固了一样停在了38行上了,如果我们在第13行进行一个notify()调用的话,那线程会从第38行上唤醒,继续从第39行开始执行以下的代码了。

  通过以上的讲述,我们现在就不难理解simplethread类了,第9-14行通过设置一个标志runningflag激活当前线程,第25-29行是simplethread类的构造函数,它用来告诉客户端启动的是第几号进程。第31-50行则是我实现的run()接口,它实际上是一个无限循环,在循环中首先判断一下标志runningflag,如果没有runningflag为false的话,那线程处理睡眠状态,否则第42-45行会进行真正的处理:先打印用户键入的字符串,然后睡眠5秒钟,为什么要睡眠5秒钟呢?如果你不加上这句代码的话,由于计算机处理速度远远超过你的键盘输入速度,因此你看到的总是第1号线程来处理你的请求,从而达不到演示效果。最后第45行调用setrunning()方法又将线程置于睡眠状态,等待新请求的到来。

  最后还有一点要注意的是,如果你在一个方法中调用了wait()和notify()函数,那你一定要将此方法置为同步的,即synchronized,否则在编译时会报错,并得到一个莫名其妙的消息:“current thread not owner”(当前线程不是拥有者)。

  至此为止,我们完整地实现了一个线程池,当然,这个线程池只是简单地将客户端输入的字符串打印到了屏幕上,而没有做任何处理,对于一个真正的企业级运用,本例还是远远不够的,例如错误处理、线程的动态调整、性能优化、临界区的处理、客户端报文的定义等等都是值得考虑的问题,但本文的目的仅仅只是让你了解线程池的概念以及它的简单实现,如果你想成为这方面的高手,本文是远远不够的,你应该参考一些更多的资料来深入地了解它。 >>>更多专题请看java线程专题
上一页 1 2 3 
相关内容:艺术  效果  操作系统  unix  java  
【收藏此页】【大 中 小】【打印】【关闭】
上一篇:java基础-如何编写一个java的队列类
下一篇:java swing中的键盘事件处理


10万个软件免费高速下载
教育教学 安全相关 游戏娱乐 源码下载 编程开发 数码软件 其它类别
网络软件 联络聊天 系统工具 媒体工具 图形图像 应用软件 行业软件
·偷窥你的源代码:把swf还原成fla
·用vb写下载者最短代码
·vb中一个非常简单的截屏代码
·hough检测直线,圆,椭圆的部分代码
·freebsd启动扇区代码分析(ver5.2.1)
·中国地区三级联动下拉菜单代码和示例
·8个开发更安全代码的简单规则
·检查email地址格式的代码
·qq空间女生版导航代码
·优化你的 perl 代码
 
·接口和抽象类的定义方式举例说明
·用maven制作java项目发行包
·java 基础入门 pom.xml 元素描述
·用jbuilder2007开发扩展jsf标签的插
·抽象类对象类和对象包装类
·使用java实现在文件中添加字符串
·instanceof和回调概念
·java变量的赋值与传递
·java se6调用java编译器的两种新方法
·weblogic运用db的java控件访问数据库

扫描关注微信公众号