Java 线程中断对我不起作用(在 groovy 中)

Java thread interruption won't work for me (in groovy)

感觉有点愚蠢,因为我现在正试图为已经在 groovy 中工作几个小时的线程获取一个简单的中断。

不知何故,以下代码不会在线程 'name' 中设置 'interrupted' 标志。导致循环 运行 直到结束。

发现大量其他问题,其中通常缺少 Thread.currentThread().isInterrupted() 的检查。但这里不是这样的:

def t = Thread.start('name') {
    try {
        for (int i = 0; i < 10 && !Thread.currentThread().isInterrupted(); ++i) {
            println "$i"
            sleep 1000
        }
    } catch (InterruptedException e) {
        println "Catched exception"
        Thread.currentThread().interrupt();
    }
}
println "Interrupting thread in 1..."
sleep 1000
println "Interrupting thread..."
t.interrupt()
sleep 2000

我得到以下输出

Interrupting thread in 1...
0
Interrupting thread...
1
2
3
4
5
6
7
8
9

想知道我在这里错过了什么/做错了什么? 还尝试使用 ExecutorService 并在返回的 Future 上调用 cancel(true)。也没用。

如果在 sleeping 时中断线程,休眠中断线程 catchesThread.sleep 抛出 InterruptedException 并且中断状态被清除。所以你的 Thread.currentThread().isInterrupted() 总是 returns false.

如果将 sleep 1000 替换为 Thread.sleep(1000),则可以使代码正常工作。

TL;DR: 不要使用 Thread 中断作为中止标准,而是使用一些自定义标志。


您没有使用会抛出 InterruptedExceptionThread.sleep(),而是使用处理和忽略中断的 GDK Object.sleep()http://docs.groovy-lang.org/docs/groovy-2.4.7/html/groovy-jdk/java/lang/Object.html#sleep(long)

要么使用 Thread.sleep() 代替:(在你的情况下中断 catch 块是无用的)

def t = Thread.start('name') {
    try {
        for (int i = 0; i < 10 && !Thread.interrupted(); ++i) {
            println i
            Thread.sleep 1000
        }
    } catch (InterruptedException e) {
        println "Catched exception"
    }
}
println "Interrupting thread in 1..."
sleep 1000
println "Interrupting thread..."
t.interrupt()

或者使用 Object.sleep() 的变体和 Closure 并在其中中止你的循环,e。 G。通过投掷 InterruptedException 如:

def t
t = Thread.start('name') {
    try {
        for (int i = 0; i < 10 && !Thread.interrupted(); ++i) {
            println i
            sleep(1000) {
                throw new InterruptedException()
            }
        }
    } catch (InterruptedException e) {
        println "Catched exception"
    }
}
println "Interrupting thread in 1..."
sleep 1000
println "Interrupting thread..."
t.interrupt()

解决了你的困惑,现在让我建议你不要做你想做的事。中断绝不是用作中止条件的好方法。由于各种原因,睡眠或阻塞 IO 总是会被中断。更好的方法是让你的 运行-loop 检查一些你切换到中止工作的 boolean 标志。