我可以看到这个问题被问了很多次。很抱歉再次询问这个问题。我有一个奇怪的问题。
我有一个作业,它通过 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/