如何在java中结束一个线程?

时间:2010-05-31 20:50:18

标签: java multithreading concurrency

我有2个线程池

ioThreads = (ThreadPoolExecutor)Executors.newCachedThreadPool();

cpuThreads = (ThreadPoolExecutor)Executors.newFixedThreadPool(numCpus);

我有一个简单的网络抓取工具,我想创建一个iothread,传递一个网址,然后它会获取网址并将内容传递给cpuThread进行处理,然后ioThread将获取另一个网址等。 ..

在某些时候,IO线程将不会有任何要抓取的新页面,我想更新我的数据库,以确保此会话已完成。我怎样才能最好地判断线程何时完成处理并且程序可以结束?

3 个答案:

答案 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并退出。