dyskusja w Code Review chat określane następujące zachowanie z punktu A ScheduledExecutorService:ScheduledExecutorService i nieprzechwycony Błąd
Zadanie zaplanowane powiedzie się z „poważnego” problem, ale nie ma raportu, wyjątek lub dziennika problemu . W innych kontekstach aplikacja normalnie kończyłaby się błędem. Jednak w kontekście ScheduledExecutorService w ogóle nie ma "obsługi wyjątków/błędów".
Po pierwsze, aby wyprodukować problem. Poniższa klasa ma statyczny inicjator, który jest gwarantowany na niepowodzenie:
public class InitializerFault {
private static final int value = Integer.parseInt("fubar");
@Override
public String toString() {
return "" + value;
}
}
Przy wykorzystaniu:
public static void main(String[] args) {
System.out.println(new InitializerFault());
}
produkuje (co jest dokładnie to, czego można się spodziewać):
Exception in thread "main" java.lang.ExceptionInInitializerError
at SimpleHandler.main(SimpleHandler.java:5)
Caused by: java.lang.NumberFormatException: For input string: "fubar"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at InitializerFault.<clinit>(InitializerFault.java:4)
... 1 more
Ale w przypadku:
private static final Thread buildThread(Runnable r) {
Thread t = new Thread(r, "TestThread");
t.setDaemon(true);
System.out.println("Built thread " + t);
return t;
}
public static void main(String[] args) throws InterruptedException {
// use a thread factory to create daemon threads ... can be non-daemon as well.
ScheduledExecutorService ses = Executors.newScheduledThreadPool(
2, (r) -> buildThread(r));
ses.scheduleAtFixedRate(
() -> {System.out.println(new InitializerFault());},
500, 1000, TimeUnit.MILLISECONDS);
Thread.sleep(3000);
System.out.println("Exiting");
}
produkuje tylko:
Built thread Thread[TestThread,5,main]
Exiting
Nie ma wzmianki o błędach, żadnych błędach, żadnych zrzutach, niczym. Ten wyjątek ExceptionInInitializerError spowodował skomplikowany proces debugowania w czasie rzeczywistym, w którym problem był bardzo trudny do wyizolowania.
dwa pytania:
- jest to oczekiwane zachowanie Java, że błędy w Wykonawcami są 'ignorowane'?
- jaki jest właściwy sposób na rozwiązanie tej sytuacji?
To może ci pomóc [Obsługa wyjątków w ThreadPools] (http://stackoverflow.com/questions/3875739/exception-handling-in-threadpools/3875968# 3875968) –