Tuesday 17 June 2008

Thread, ThreadPool and ThreadLocal

孙悟空有72个线程(Thread)。他同时可以做72件事情。在没事的时候,这72个线程监听一个任务队列(Task Queue),等待任务(Task),不怎么消耗资源;当一个任务来的时候,这72个线程中的一个会得到这个任务,并去执行。因此孙悟空的这72个线程可以称作一个线程池(ThreadPool)。



线程池的一个线程有两种状态:等待任务和执行任务。等待任务并不意味着该线程是死的,就像人睡觉不等于死一样。有些任务在执行过程中,会往线程上放一些数据,这些数据只期望在线程内能访问到。这些数据叫线程本地数据(ThreadLocal)。



一个任务执行完了,执行该任务的线程会等待新的任务来执行。任务结束并不等于线程结束。那些线程本地数据也还在,不会被清理。因此当一个任务运行多次,可能发现一些现成本地数据是脏的(Dirty)。



那怎么办呢?



一个策略是设计线程池的时候,就考虑线程本地数据的清理。对一般已有的线程池实现,靠谱的也会考虑这个问题。

No comments: