停止自定义线程池中的所有线程(如关闭)
Stop all threads in a custom thread pool (like shutting down)
在 Java 库线程池实现中,通常关闭池意味着:
-停止接受新任务
-之前提交的任务被执行
-所有池线程都已终止
关于最后一点,在它被停止后,您如何停止可能尝试接受新任务的池线程?
我的线程做这样的事情(在 java 伪代码中):
public void run() {
while(!isStopped) {
Task task = taskQueue.take(); //line1
task.run(); //line2
}
}
并有一个方法停止:
public synchronized void stop(){
isStopped = true;
this.interrupt();
}
在我的线程池class中,我有一个方法停止:
public synchronized void shutdown(){
this.isShutdown = true; //to stop the whole pool
for(PoolThread thread : threads)
thread.stop();
}
重点是,如果线程到达第 1 行,isStopped 为假,但在同一时刻它可以被池设置为真 class。我怎么记得我应该再次停止线程?调用中断是否足够?
通过任务队列发送关机消息:
static Task stop = // some special value
public void run() {
while (true) {
Task task = taskQueue.take();
if (task == stop) {
break;
}
task.run();
}
}
在shutDown
中:
public synchronized void shutdown(){
if (isShutdown) {
return;
}
this.isShutdown = true;
for(PoolThread thread : threads) {
taskQueue.put(PoolThread.stop);
}
}
队列中的关闭消息数量等于线程的数量,一旦所有工作完成,线程将各自接收一条关闭消息并关闭。 (请注意,我们不需要关心哪个线程收到哪个关闭消息。)
在 Java 库线程池实现中,通常关闭池意味着:
-停止接受新任务
-之前提交的任务被执行
-所有池线程都已终止
关于最后一点,在它被停止后,您如何停止可能尝试接受新任务的池线程?
我的线程做这样的事情(在 java 伪代码中):
public void run() {
while(!isStopped) {
Task task = taskQueue.take(); //line1
task.run(); //line2
}
}
并有一个方法停止:
public synchronized void stop(){
isStopped = true;
this.interrupt();
}
在我的线程池class中,我有一个方法停止:
public synchronized void shutdown(){
this.isShutdown = true; //to stop the whole pool
for(PoolThread thread : threads)
thread.stop();
}
重点是,如果线程到达第 1 行,isStopped 为假,但在同一时刻它可以被池设置为真 class。我怎么记得我应该再次停止线程?调用中断是否足够?
通过任务队列发送关机消息:
static Task stop = // some special value
public void run() {
while (true) {
Task task = taskQueue.take();
if (task == stop) {
break;
}
task.run();
}
}
在shutDown
中:
public synchronized void shutdown(){
if (isShutdown) {
return;
}
this.isShutdown = true;
for(PoolThread thread : threads) {
taskQueue.put(PoolThread.stop);
}
}
队列中的关闭消息数量等于线程的数量,一旦所有工作完成,线程将各自接收一条关闭消息并关闭。 (请注意,我们不需要关心哪个线程收到哪个关闭消息。)