Ich möchte die Task
wissen, die vom Executor abgelehnt wird. Zum Beispiel möchte ich den Namen der abgelehnten Aufgabe bekommen. Aber in der RejectedExecutionHandler
kann ich das nicht tun!Wie erhalte ich das Feld der Aufgabe im RejectedExecutionHandler?
Hier ist mein Code:
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;
}
}
Ihre Aufgabe wird in eine FutureTask eingepackt, die keine Aufgabe für die Aufgabe bereitstellt. Sie können reflection verwenden, um auf das "callable" Feld der 'FutureTask' zuzugreifen, aber das ist kein sehr robuster Ansatz. – assylias
Override RejectedExecutionHandler und erstellen Sie Ihre eigenen. Es ist der beste Weg. – canillas
@canillas das ist, was in dem Code in der Frage getan wurde. Die Frage ist, wie man von der Runnable auf die zugrunde liegende Aufgabe zugreift. – assylias