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)
。也没用。
如果在 sleep
ing 时中断线程,休眠中断线程 catches 由 Thread.sleep
抛出 InterruptedException
并且中断状态被清除。所以你的 Thread.currentThread().isInterrupted()
总是 returns false
.
如果将 sleep 1000
替换为 Thread.sleep(1000)
,则可以使代码正常工作。
TL;DR: 不要使用 Thread
中断作为中止标准,而是使用一些自定义标志。
您没有使用会抛出 InterruptedException
的 Thread.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
标志。
感觉有点愚蠢,因为我现在正试图为已经在 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)
。也没用。
如果在 sleep
ing 时中断线程,休眠中断线程 catches 由 Thread.sleep
抛出 InterruptedException
并且中断状态被清除。所以你的 Thread.currentThread().isInterrupted()
总是 returns false
.
如果将 sleep 1000
替换为 Thread.sleep(1000)
,则可以使代码正常工作。
TL;DR: 不要使用 Thread
中断作为中止标准,而是使用一些自定义标志。
您没有使用会抛出 InterruptedException
的 Thread.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
标志。