java - 终止 Java 线程

标签 java multithreading

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

我有一个作业,它通过 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/

相关文章:

java - Tinkergraph的多线程阅读

python - 使用多处理并行运行 rpy2 会引发无法捕获的奇怪异常

multithreading - react-native 是否支持多线程和后台线程或并行执行?我们怎么做?

Java Thread() sleep 问题

Java:字符串、字符、如果、错误

java - 如何将源代码附加到 Eclipse 中的项目库中?

java - 如何获取FTP服务器的文件分隔符

java - 二元运算符 '<' 第一个类型 : float second type: Object 的错误操作数类型

python - 如何在Python中处理具有固定线程数的队列中的多个作业

c++ - 具有相互独立线程的多线程开销