Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中结束线程?_Java_Multithreading_Concurrency - Fatal编程技术网

如何在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
from
run()
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