【问题标题】:Can I use executorservice to kill a specific thread if it's been running for too long?如果运行时间过长,我可以使用 executorservice 杀死特定线程吗?
【发布时间】:2012-10-18 13:30:05
【问题描述】:

到目前为止,在我对 executorservice 的实验中,我有很多建议涉及使用future.get,然后是future.cancel,以便抛出一个线程中断,然后需要在线程中捕获并处理该中断那里。我的问题有点不同。

假设我正在运行一个线程,它只是跟踪事物运行了多长时间以及它们是否超过了某个阈值,这是否是杀死 executorservice 和所有正在运行的线程的好方法?

示例思考过程:

ExecutorService threadPool = Executors.newFixedThreadPool(12);
timekeeper.start();
List<Future<?>> taskList = new ArrayList<Future<?>>();
    for (int i = 0; i < objectArray.length; i++) {
        Future<?> task = threadPool.submit(new ThreadHandler(objectArray[i], i));
        taskList.add(task);
        Thread.sleep(500);
    }

if(timekeeper.now() > 60)
    threadpool.shutdownNow();
}

这行得通吗?我无法检查,因为我的线程极少发生故障(大约 1/700 次运行,并且仅在我不工作的一天中的特定时间)。

【问题讨论】:

  • 我知道的最有效的杀死方法是 .stop() 方法,已弃用但它仍然有效

标签: java multithreading interrupt executor


【解决方案1】:

shutdownNow 方法尝试中断所有活动的任务线程,这只有在任务被编码为受尊重的中断时才有效。他们需要:

  • 检查是否在长时间运行的循环中设置了中断标志,并且

  • 正确处理InterruptedExceptions。

基本上,任务需要合作才能使中断工作。如果他们不合作,就没有安全可靠的方法来阻止他们……除了退出 JVM。


上面有人提到了 .stop() 方法作为评论,你能评论一下为什么这是一个坏主意吗?

Thread.stop() 方法是deprecated,因为它根本不安全。停止一个线程会使关键数据结构处于中间状态,并且会干扰以各种方式与其交互的其他线程。理论上可以安全地使用stop,但很难制定出一套足以确保没有坏事发生的通用前提条件。

【讨论】:

    【解决方案2】:

    这就是我要做的

    ExecutorService threadPool = Executors.newFixedThreadPool(12);
    List<Future<?>> taskList = new ArrayList<Future<?>>();
    for (int i = 0; i < objectArray.length; i++) {
        taskList.add(threadPool.submit(new ThreadHandler(objectArray[i], i)));
    threadPool.shutdown();
    threadPool.awaitTermination(60, TimeUnit.SECONDS); // or what ever
    threadPool.shutdownNow();
    

    这假设您的任务将尊重中断。如果他们不这样做,就没有干净的方法来杀死线程(除了使用一个几乎相同的标志)


    这里不使用 Thread.stop() 的原因

    • 您无权访问 Thread 对象来调用 stop()。
    • 如果一个任务忽略了 interrupt(),它很可能表现不佳,这会使堆处于损坏状态。
    • 调用 stop() 应该会停止任务,但不会停止线程池线程,除非它是 shutdown(),因为它会捕获它。 (诚​​然,很容易解决)

    【讨论】:

    • 上面有人提到了 .stop() 方法作为评论,你能评论一下为什么这是一个坏主意吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多