我有2个线程池
ioThreads = (ThreadPoolExecutor)Executors.newCachedThreadPool();
cpuThreads = (ThreadPoolExecutor)Executors.newFixedThreadPool(numCpus);
我有一个简单的网络抓取工具,我想创建一个iothread,传递一个网址,然后它会获取网址并将内容传递给cpuThread进行处理,然后ioThread将获取另一个网址等。 ..
在某些时候,IO线程将不会有任何要抓取的新页面,我想更新我的数据库,以确保此会话已完成。我怎样才能最好地判断线程何时完成处理并且程序可以结束?
答案 0 :(得分:2)
一种典型的方法是使用公共(易失性或同步)布尔标志在线程之间进行通信。 IO线程完成后,它会翻转该标志。另一个线程在循环中检查标志值,当它看到更改的值时,它退出循环并终止。
如果您将生产者 - 消费者模型与IO线程和处理线程之间的工作队列一起使用,另一种可能性是将特殊的“处理结束”令牌传递给队列,这会向处理器发出信号通知他们可以终止。
答案 1 :(得分:2)
您可以等待所有线程完成使用CyclicBarrier,例如http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html
答案 2 :(得分:0)
布置程序逻辑。将URL存储在Stack对象中(堆栈是线程安全的)。
如果
a. there are no more URLs on the stack
b. no more crawler threads running
c. no more CPU/processing threads running
然后程序可以写入DB并退出。