Tôi muốn xử lý các ngoại lệ được đề xuất bởi các chuỗi công nhân theo phương thức ThreadPoolExecutor#afterExecute()
. Hiện nay tôi có mã này:Tại sao ngoại lệ là null trong afterExecute() của ThreadPoolExecutor?
public class MyExecutor extends ThreadPoolExecutor {
public static void main(String[] args) {
MyExecutor threadPool = new MyExecutor();
Task<Object> task = new Task<>();
threadPool.submit(task);
}
public MyExecutor() {
super(4, 20, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(4000));
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
System.out.println("in afterExecute()");
if (t != null) {
System.out.println("exception thrown: " + t.getMessage());
} else {
System.out.println("t == null");
}
}
private static class Task<V> implements Callable<V> {
@Override
public V call() throws Exception {
System.out.println("in call()");
throw new SQLException("testing..");
}
}
}
Nếu tôi chạy đoạn code tôi nhận được kết quả:
in call()
in afterExecute()
t == null
Tại sao là tham số Throwable t
null
trong afterExecute()
? Không phải là phiên bản SQLException
?
Cảm ơn bạn đã xóa thông tin đó. Vì vậy, tất cả các trường hợp ngoại lệ được kiểm tra sẽ chỉ được nuốt bởi ThreadPoolExecutor? Và tất cả xử lý ngoại lệ phải được thực hiện trong Callable # call()? –
@ potato300 Xem chỉnh sửa của tôi, có điều gì đó khác xảy ra trong ví dụ cụ thể của bạn (mà tôi không nhận thấy lúc đầu) – Tunaki