ScheduledExectorServiceが異常後のタスクを続行しない問題に遭遇しました。


最近はプログラムを書きましたが、プログラムは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を追加すると、タイミングタスクがキャンセルされていないことが分かります。