ScheduledExectorServiceが異常後のタスクを続行しない問題に遭遇しました。
2127 ワード
最近はプログラムを書きましたが、プログラムはSchduledExectorServiceのscheduleAtFixedderate方法を使って、タイミングでタスクを実行します。しかし、プログラムが実行されてからしばらく時間が経っても、タイムタスクが実行されなくなりました。最後にJDKのソースコードを見ました。ソースのJava docで発見された言葉は次の通りです。If any execution of the task encounters an exception、subsequent executions are suppress.Otherwise、the task will only termination。
簡単にまとめると、タイミングタスクの実行中に異常が発生した場合、後のタスクは実行されなくなります。 私達は実験して検証することができます。
実行結果:
上のコードを修正します。
簡単にまとめると、タイミングタスクの実行中に異常が発生した場合、後のタスクは実行されなくなります。 私達は実験して検証することができます。
package zmx.jdkthreadpool.test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Test {
private final static ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
public static void main(String[] args) {
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
int[] s = new int[1];
System.out.println("OK");
System.out.println(s[1]); //
}
}, 0, 2, TimeUnit.SECONDS);
}
}
実行結果:
OK
タイミングタスクは一回だけ実行されましたが、初めて実行したので、配列逸脱異常に遭い、後のタスクはキャンセルされました。上のコードを修正します。
package zmx.jdkthreadpool.test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Test {
private final static ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
public static void main(String[] args) {
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
int[] s = new int[1];
System.out.println("OK");
System.out.println(s[1]); //
} catch (Throwable t) {
System.out.println("Error");
}
}
}, 0, 2, TimeUnit.SECONDS);
}
}
実行効果:OK
Error
OK
Error
OK
Error
OK
Error
try/catchを追加すると、タイミングタスクがキャンセルされていないことが分かります。