ad_qqread_mid_big">
下面我们再来看一下process()方法,第30-40行的循环依次从vector数组中选取simplethread线程,并检查它是否处于激活状态(所谓激活状态是指此线程是否正在处理客户端的请求),如果处于激活状态的话,那继续查找vector数组的下一项,如果vector数组中所有的线程都处于激活状态的话,那它会打印出一条信息,提示用户稍候再试。相反如果找到了一个睡眠线程的话,那第35-38行会对此进行处理,它先告诉客户端是哪一个线程来处理这个请求,然后将客户端的请求,即字符串argument转发给simplethread类的setargument()方法进行处理,并调用simplethread类的setrunning()方法来唤醒当前线程,来对客户端请求进行处理。
可能你还对setrunning()方法是怎样唤醒线程的有些不明白,那我们现在就进入最后一个类: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线程专题
下面我们再来看一下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”(当前线程不是拥有者)。
至此为止,我们完整地实现了一个线程池,当然,这个线程池只是简单地将客户端输入的字符串打印到了屏幕上,而没有做任何处理,对于一个真正的企业级运用,本例还是远远不够的,例如错误处理、线程的动态调整、性能优化、临界区的处理、客户端报文的定义等等都是值得考虑的问题,但本文的目的仅仅只是让你了解线程池的概念以及它的简单实现,如果你想成为这方面的高手,本文是远远不够的,你应该参考一些更多的资料来深入地了解它。
| 上一页 1 2 3 |
| 相关内容:艺术 效果 操作系统 unix java |
| 【收藏此页】【大 中 小】【打印】【关闭】 | |
| 上一篇:java基础-如何编写一个java的队列类 下一篇:java swing中的键盘事件处理 10万个软件免费高速下载 | |
| ||||||||||||||
|
|
-
关于我们
公司介绍 最新动态 联系我们 -
产品与服务
域名注册 jsp空间 php空间 -
常见问题
空间操作手册 网站备案相关 退款相关问题 -
技术支持
技术 QQ :178966803 联系电话:13616026886 联系邮箱:fjjsp@vip.163.com
扫描关注微信公众号
闽公网安备 35060202000074号