Java 如何处理拒绝,使Future.get()不会永远被拒绝?
我玩了Java的Java 如何处理拒绝,使Future.get()不会永远被拒绝?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我玩了Java的ThreadPoolExecutor类。这是我的密码 public class MyReject { public static void main(String[] args) { ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 50000L, TimeUnit.MICROSECONDS, new LinkedBlockingQueue<Runnable
ThreadPoolExecutor
类。这是我的密码
public class MyReject {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5,
50000L, TimeUnit.MICROSECONDS, new LinkedBlockingQueue<Runnable>(5));
executor.setRejectedExecutionHandler((r, ex) -> {
System.out.println("Rejected!");
}
);
Task[] tasks = new Task[20];
Future<?>[] future = new Future[20];
for (int i = 0; i < 20; i++) {
tasks[i] = new Task(40, "Task " + i);
future[i] = executor.submit(tasks[i]);
}
for (int i = 0; i < 20; i++) {
try {
System.out.println(future[i].get());
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
}
executor.shutdown();
}
公共类MyReject{
公共静态void main(字符串[]args){
ThreadPoolExecutor executor=新的ThreadPoolExecutor(5,5,
50000升,时间单位。微秒,新的LinkedBlockingQueue(5));
executor.setRejectedExecutionHandler((r,ex)->{
System.out.println(“拒绝!”);
}
);
任务[]任务=新任务[20];
未来[]未来=新未来[20];
对于(int i=0;i<20;i++){
任务[i]=新任务(40,“任务”+i);
未来[i]=执行人提交(任务[i]);
}
对于(int i=0;i<20;i++){
试一试{
System.out.println(future[i].get());
}捕捉(中断异常e){
}捕获(执行例外){
}
}
executor.shutdown();
}
}
我看到一些未来[I].get()
将永远等待,因为相应的任务被执行者提前拒绝。我如何告诉未来[I].get()
该任务已被拒绝,因此您不想再等待了
非常感谢,,
另外,假设我不想使用未来[I]。get(timeout,TimeUnit)
如果删除对
setRejectedExecutionHandler
的调用,那么如果执行者拒绝任务,submit
将抛出一个RejectedExecutionException
。如果删除对
setRejectedExecutionHandler
的调用,然后,如果执行者拒绝任务,submit
将抛出一个RejectedExecutionException
。您可以在RejectedExecutionHandler
中取消该任务,在这种情况下,当您尝试调用get
时,它将抛出取消异常
executor.setRejectedExecutionHandler((r,ex)->{
if(未来任务的r实例){
((FutureTask)r).取消(false);
}
System.out.println(“拒绝!”);
});代码>
如果您不想捕获异常,则可以在任务类中创建一个自定义属性rejected
,并将其设置在RejectedExecutionHandler
中。在调用Future.get()之前,请检查拒绝的
属性值。您可以在拒绝的执行处理程序
中取消该任务,在这种情况下,当您尝试在拒绝的Future上调用获取
时,它将抛出取消异常
executor.setRejectedExecutionHandler((r,ex)->{
if(未来任务的r实例){
((FutureTask)r).取消(false);
}
System.out.println(“拒绝!”);
});代码>
如果您不想捕获异常,则可以在任务类中创建一个自定义属性rejected
,并将其设置在RejectedExecutionHandler
中。在调用Future.get()之前,请检查rejected
属性值。Yes。如果我删除setRejectedExecutionHandler
,submit将抛出一个RejectedExecutionException
,但future.get()
仍将永远等待被拒绝的任务。是。但是,您可以使用这些信息来避免首先调用get()。是的。如果我删除setRejectedExecutionHandler
,submit将抛出一个RejectedExecutionException
,但future.get()
仍将永远等待被拒绝的任务。是。但是,您可以首先使用这些信息来避免调用get()。