gpt4 book ai didi

java - 停止自定义线程池中的所有线程(如关闭)

转载 作者:行者123 更新时间:2023-12-01 11:24:30 25 4
gpt4 key购买 nike

在 Java 库线程池实现中,通常关闭线程池意味着:

-停止接受新任务

-执行之前提交的任务

-所有池线程都终止

关于最后一点,在停止之后,如何停止可能尝试执行新任务的池线程?

我的线程做了类似的事情(用java伪代码):

public void run() {
while(!isStopped) {
Task task = taskQueue.take(); //line1
task.run(); //line2
}
}

并有一个方法停止:

public synchronized void stop(){
isStopped = true;
this.interrupt();
}

在我的线程池类中,我有一个方法 stop:

public synchronized void shutdown(){
this.isShutdown = true; //to stop the whole pool
for(PoolThread thread : threads)
thread.stop();
}

重点是,如果线程到达第 1 行,isStopped 为 false,但同时池类可以将其设置为 true。我怎么记得我应该再次停止线程?调用中断就够了吗?

最佳答案

通过任务队列发送关闭消息:

static Task stop = // some special value

public void run() {
while (true) {
Task task = taskQueue.take();
if (task == stop) {
break;
}
task.run();
}
}

并在关闭中:

public synchronized void shutdown(){
if (isShutdown) {
return;
}
this.isShutdown = true;
for(PoolThread thread : threads) {
taskQueue.put(PoolThread.stop);
}
}

队列中的关闭消息数量等于线程数量,一旦所有工作完成,每个线程都会收到关闭消息并关闭。 (请注意,我们不需要关心哪个线程收到哪个关闭消息。)

关于java - 停止自定义线程池中的所有线程(如关闭),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30952344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com