私はいくつかのコードを持っています:
public class MyTask implements Runnable {
@Override
public void run() {
// Some code
Thread.sleep();
// Some more code.
}
}
ExecutorService executor = Executors.newCachedThreadPool();
List<MyTask> tasks = getTasks();
for(MyTask t : tasks)
executor.execute(t);
executor.shutdownNow()
if(!executor.awaitTermination(30, TimeUnit.MINUTES)) {
TimeoutException toExc = new TimeoutException("MyAPp hung after the 30 minutes timeout was reached.") // TODO
log.error(toExc)
throw toExc
}
MyTask
から戻ってきた複数のインスタンスでこれを実行するとgetTasks()
、非常に不思議になります。
[pool-3-thread-3] INFO me.myapp.MyTask - java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
...etc.
ここでの問題は、根本的な原因がないことです。スレッドのスリープは、ある時点で「中断」されているだけです。
だから私は尋ねます:いつ/なぜThread.sleep()
中断されたのか、そして例外の根本的な原因を突き止めるために何ができるでしょうか?