gpt4 book ai didi

java - 终止 Java 线程

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:46 26 4
gpt4 key购买 nike

我可以看到这个问题被问了很多次。很抱歉再次询问这个问题。我有一个奇怪的问题。

我有一个作业,它通过 ExecutorService 作为单独的可运行任务提交数千个作业。这是通过一个简单的 for 循环完成的。 for 循环结束时,我调用 service.shutdown() ,然后调用awaitTermination。

由于要提交的线程数量巨大,线程会一直挂起,直到所有任务都提交为止。

有什么办法可以让这些线程在执行完成后立即优雅地终止吗?

最佳答案

您可以创建一个新的ThreadPoolExecutor而不调用java.util.concurrent.Executors:

    int corePoolSize = 0;
int maximumPoolSize = 64;
int keepAliveTime = 5000;
ExecutorService executorService =
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,
TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());

摘自javadoc:“如果池当前拥有超过 corePoolSize 的线程,则多余的线程如果空闲时间超过 keepAliveTime 将被终止”

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html

编辑:

这是一个小示例,如果您在 Eclipse 调试环境中运行它,您应该会看到线程来来去去:

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class ExecutorTest {

public static void main(String[] args) {

ExecutorService executorService = new ThreadPoolExecutor(0, 64, 1000,
TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());

for (int i = 0; i <= 500; i ++) {

try {
Thread.sleep(new Random().nextInt(200));
} catch (InterruptedException e) {
}

executorService.submit(new TestTask());
}
}

public static class TestTask implements Runnable {
public void run() {
try {
Thread.sleep(new Random().nextInt(1500));
} catch (InterruptedException e) {
}
}
}
}

关于java - 终止 Java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19365231/

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