【发布时间】:2019-12-25 18:40:39
【问题描述】:
来自互联网上的多篇文章,建议不要吞下InterruptedException。当我要重用同一个线程时,使用类似这样的线程池执行器执行此操作更有意义。
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future = executor.submit(() -> {
printNumbers(); // first call
printNumbers(); // second call
});
Thread.sleep(3_000);
executor.shutdownNow(); // will interrupt the task
executor.awaitTermination(3, TimeUnit.SECONDS);
}
private static void printNumbers() {
for (int i = 0; i < 10; i++) {
System.out.print(i);
try {
Thread.sleep(1_000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // preserve interruption status
break;
}
}
}
上面来自DZone的代码示例。
但在每次都创建新线程的情况下:
Object LOCK = new Object();
public void doSomeJob() {
myThread = new Thread(new Runnable() {
public void run() {
try {
synchronized(LOCK) {
System.out.println("Inside run");
LOCK.wait();
}
} catch(InterruptedException ignored){}
}
}
}
我还需要打电话给Thread.currentThread().interrupt();吗?这有意义吗?
好的参考:
https://codepumpkin.com/interrupt-interrupted-isinterrupted-java-multithreading/
http://michaelscharf.blogspot.com/2006/09/dont-swallow-interruptedexception-call.html
【问题讨论】:
-
旁白:你也可以把 try/catch InterruptedException 放在循环之外,因为中断具有打破循环的效果。
-
好收获。你是对的!
-
我根据 DZone 更正了循环,据我所知,打破循环是 sample 的作者的意思。如果不同意,请添加注释说明代码已从原始代码更改。
-
mmmm 我看到了一个等待方法,但我没有看到任何同步块。你需要获得一个对象的锁才能使用等待方法释放它...我的意思是:您应该放置一个
synchronized (lock) {...}块来包装等待调用 -
只是另一个解释一些相关问题的链接:javaspecialists.eu/archive/Issue056.html
标签: java multithreading interrupt