如果特定线程运行时间过长,我可以使用 executorservice 杀死它吗?

A_E*_*ric 5 java multithreading interrupt executor

到目前为止,在我对 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 6

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

  • 检查长时间运行的循环中是否已设置中断标志,以及

  • 正确处理InterruptedExceptions。

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


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

该Thread.stop()方法已被弃用,因为它从根本上来说是不安全的。停止线程可能会使关键数据结构处于中间状态,并且可能会干扰以各种方式与其交互的其他线程。理论上是可以stop安全使用的,但是很难制定出一套足以确保不会发生任何不良情况的通用前提条件。