如何在java中结束线程?
我有两个线程池如何在java中结束线程?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有两个线程池 ioThreads = (ThreadPoolExecutor)Executors.newCachedThreadPool(); cpuThreads = (ThreadPoolExecutor)Executors.newFixedThreadPool(numCpus); 我有一个简单的网络爬虫,我想创建一个iothread,向它传递一个url,然后它将获取url,并将内容传递给要处理的cpuThread,iothread将获取另一个url,等等 在某个时刻,IO线程将不会有
ioThreads = (ThreadPoolExecutor)Executors.newCachedThreadPool();
cpuThreads = (ThreadPoolExecutor)Executors.newFixedThreadPool(numCpus);
我有一个简单的网络爬虫,我想创建一个iothread,向它传递一个url,然后它将获取url,并将内容传递给要处理的cpuThread,iothread将获取另一个url,等等
在某个时刻,IO线程将不会有任何新的页面需要抓取,我想更新我的数据库,以确保此会话已完成。如何才能最好地判断线程何时全部完成处理,程序何时可以结束?典型的方法是使用公共(易失性或同步)布尔标志在线程之间进行通信。当IO线程完成时,它会翻转标志。另一个线程检查循环中的标志值,当它看到更改的值时,它退出循环并终止
如果在IO线程和处理线程之间使用具有工作队列的生产者-消费者模型,另一种可能是向队列传递一个特殊的“处理结束”标记,这将向处理器发出终止信号。一种典型的方法是使用公共(易失性或同步)布尔标志在线程之间进行通信。当IO线程完成时,它会翻转标志。另一个线程检查循环中的标志值,当它看到更改的值时,它退出循环并终止
如果在IO线程和处理线程之间使用具有工作队列的生产者-消费者模型,另一种可能是向队列传递特殊的“处理结束”标记,这将向处理器发出它们可以终止的信号。例如,您可以等待所有线程完成使用CyclicBarrier例如,您可以等待所有线程完成使用CyclicBarrier布局程序逻辑。在堆栈对象中存储URL(堆栈是线程安全的) 如果
然后程序可以写入数据库并退出 布置程序逻辑。在堆栈对象中存储URL(堆栈是线程安全的) 如果
然后程序可以写入数据库并退出 只需从
run()
方法返回return即可。毫无意义。另一个线程可以在循环中使用1ms的timeout调用join(),根本不需要布尔。@EJP,调用join()
什么?在生产者-消费者模型中,不同的线程甚至看不到彼此…:-/我指的是您建议的第一部分“使用通用(易失性或同步)布尔标志在之间进行通信”。你不需要布尔数,只要join()。@EJP,在这一部分,你可能是对的。几年前,我在Java多线程课程中了解到,join()
是不可靠的,这就是我建议使用布尔标志的原因。但这可能已经改变了,因为“Java中的并发编程”提到join()
是一个有效的解决方案(尽管非常简短)。不过,我不敢说,join()
是您所需要的一切:-)只要return
fromrun()
method.就可以了,这是毫无意义的。另一个线程可以在循环中使用1ms的timeout调用join(),根本不需要布尔。@EJP,调用join()
什么?在生产者-消费者模型中,不同的线程甚至看不到彼此…:-/我指的是您建议的第一部分“使用通用(易失性或同步)布尔标志在之间进行通信”。你不需要布尔数,只要join()。@EJP,在这一部分,你可能是对的。几年前,我在Java多线程课程中了解到,join()
是不可靠的,这就是我建议使用布尔标志的原因。但这可能已经改变了,因为“Java中的并发编程”提到join()
是一个有效的解决方案(尽管非常简短)。不过,我不敢说,join()
是您所需要的一切:-)
a. there are no more URLs on the stack
b. no more crawler threads running
c. no more CPU/processing threads running