如何停止 ExecutorService 中的 for 循环?

How to stop a for loop inside an ExecutorService?

我试过查看其他主题,但似乎找不到合适的答案,

使用 executorService.shutdownNow() 时,几乎所有任务都会按预期立即停止,但其中包含 for 循环的任务除外。 我不知道为什么会这样,但我从其他线程看到的最多的是你应该使用 Thread.currentThread().isInterrupted() 来检查它是否被中断,但是添加一个

if(Thread.currentThread().isInterrupted())
    {return;}

实际上并没有阻止这一切。当 UI 按钮关闭时,我正在调用执行程序 shutdownNow。

代码示例:

executorService.submit(() -> {
            ctx.batzUtils.keyEvent(KeyEvent.KEY_PRESSED, VK_SHIFT);
            //Shit keeps going if you call ShutdownNow Todo
            for (Rectangle rect : rects)
            {
                ctx.batzUtils.click(rect);
                try
                {
                    Thread.sleep(minDelayBetween, maxDelayBetween);
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            ctx.batzUtils.keyEvent(KeyEvent.KEY_RELEASED, VK_SHIFT);
            ctx.batzUtils.keyEvent(KeyEvent.KEY_TYPED, VK_SHIFT);
        });

任何有关原因或解决方案的想法都将不胜感激

在我的 catch 语句中添加 Thread.currentThread().interrupt() 有效

归功于@Sambit

2 个解决方案。您的 for 循环确实需要检查
if(Thread.currentThread().isInterrupted()) {[clean up and finish the thread code here]}

在您的 catch 部分,而不是 e.printStackTrace(); 放置 [清理并完成线程代码]。在 catch 语句中,您不需要检查线程是否已被中断。您捕获 InterruptedException 的事实已经是线程已被中断的标志

When using executorService.shutdownNow() almost all tasks stop immediately as intended except ones with for loops in them.

这是一个误导性的陈述。 executorService.shutdownNow() 取消所有尚未 运行 的作业并中断当前 运行 的所有线程。您的某些线程没有被中断的原因是因为您在 for 循环中捕获 InterruptedException 。每当抛出InterruptedException时,清除运行ning线程的中断位。

每当您捕获 InterruptedException 时,您应该立即 re-interrupt 运行ning 线程,以便调用者知道已设置中断。您的错误很好地说明了为什么需要这种模式。

try {
   Thread.sleep(minDelayBetween, maxDelayBetween);
} catch (InterruptedException e) {
   // when InterruptedException is thrown it clears the interrupt bit so
   // we need to re-interrupt the thread whenever we catch it
   Thread.currentThread().interrupt();
   // you should handle the interrupt appropriately and not just print it
   return;
}

这里有一个关于 Java thread interrupts 主题的很好的教程。