Java 如何处理拒绝,使Future.get()不会永远被拒绝?

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

我玩了Java的
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()。