池的线程池(Thread Pool)
前面已经提到了很多的应用服务器,都需要处理从客户端发起的任务请求,这些任务往往具有高密度,短时间的特性,无论通过什么方式在服务器得到client 请求后,服务器就需要独立的处理这个客户请求。针对这个的问题,线程池提供了处理系统性能和大用户量请求之间的矛盾的方法,通过对多个任务重用已经存在的线程对象,降低了对线程对象创建和销毁的开销,由于当客户请求到了时,线程对象已经存在,可以提高请求的响应时间从而整体的提高了系统服务的表现。
下面给出一个线程池的简单设计样例(参见图2)
分析:
在这个环境中,我们必须注意到一个问题就是线程的逻辑和应用的任务逻辑的分离,不能把用户的应用逻辑固化到线程池的实现中。如果没有达到这个目标那么这个线程池的实现是有一定的局限性的。为了实现这一点,必须对线程池的运行逻辑进行抽象通过一个任务的抽象接口来模拟客户提交的任务。
一个ThreadPool对象,它管理和创建可重用的线程对象TaskRunable,通过runTask方法接受客户提交的任务,并选择可以使用的线程对象调用它的getTaks方法使其执行任务。线程池中重用的线程对象 TaskRunnable。它是一个独立的线程对象,通过getTask方法执行由所在容器ThreadPool传递的任务。任务对象接口Itask。所以的客户任务都必须实现这个接口,从而保证线程逻辑和应用逻辑的分离。
改进:
错误恢复:在TaskRunable对象中必须时刻监视thread对象的运行状况,如果发生错误,必须通知ThreadPool 对象进行相应的处理保证所有的TaskRunable对象的运行正常,因此添加notfiyThreadCrash方法。动态管理:我们可以参照资源池的实现同样提供一个监视线程Monitor管理ThreadPool对象的运行状态,实现Pool的动态管理。