java 构建的线程池(4)
一个线程,必须调用它的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”(当前线程不是拥有者)。
至此为止,我们完整地实现了一个线程池,当然,这个线程池只是简单地将客户端输入的字符串打印
到了屏幕上,而没有做任何处理,对于一个真正的企业级运用,本例还是远远不够的,例如错误处理、线
程的动态调整、性能优化、临界区的处理、客户端报文的定义等等都是值得考虑的问题,但本文的目的仅
仅只是让你了解线程池的概念以及它的简单实现,如果你想成为这方面的高手,本文是远远不够的,你应
该参考一些更多的资料来深入地了解它。
相关新闻>>
- 发表评论
-
- 最新评论 更多>>