executorによって拒否されたTask
を知りたいとします。たとえば、私は拒否されたタスクの名前を取得したいと思います。しかし、RejectedExecutionHandler
では、私はこれを行うことができません!RejectedExecutionHandlerでタスクのフィールドを取得する方法は?
public static void main(String[] args) throws Exception{
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 1L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
(Runnable r, ThreadPoolExecutor executor1) -> {
//TODO
//want to get the task name
System.out.println("in reject:");
});
Task t1 = new Task("t1");
Task t2 = new Task("t2");
Future<Integer> t1Fe = executor.submit(t1);
Future<Integer> t2Fe = executor.submit(t2);
System.out.println(t1Fe.get());
System.out.println(t2Fe.get());
}
static class Task implements Callable{
private String name;
public Task(String name) {
this.name = name;
}
@Override
public Object call() throws Exception {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(1);
return name;
}
}
タスクはタスクにゲッターを提供しないFutureTaskにラップされます。リフレクションを使って 'FutureTask'の' callable'フィールドにアクセスすることはできますが、それは非常に強固なアプローチではありません。 – assylias
RejectedExecutionHandlerをオーバーライドし、自分自身を作成します。それが最善の方法です。 – canillas
@canillasこれは、質問のコードで行われていることです。問題は、Runnableから基本となるTaskにアクセスする方法です。 – assylias