Java 使用ExecutorService执行任务:我可以在另一个任务中提交任务吗?

Java 使用ExecutorService执行任务:我可以在另一个任务中提交任务吗?,java,multithreading,threadpool,executorservice,Java,Multithreading,Threadpool,Executorservice,如果出现故障(异常),我想在现有任务中提交新任务,但在运行以下代码时遇到一些问题: public class TestTask implements Runnable{ private int myInt; private ExecutorService exec; public TestTask(int x, ExecutorService s){ this.myInt=x; this.exec=s; } @Override public void run() {

如果出现故障(异常),我想在现有任务中提交新任务,但在运行以下代码时遇到一些问题:

public class TestTask implements Runnable{
private int myInt;
private ExecutorService exec;

public TestTask(int x, ExecutorService s){
    this.myInt=x;
    this.exec=s;
}

@Override
public void run() {         
    try{
        //print number if it's odd; otherwise throw exception
        if(this.myInt%2 ==0) throw new Exception();     
        else System.out.println("Asynchronous task: "+ this.myInt); //do sth

    } catch (Exception e) {
        System.out.println("resubmitting..");
        //## TODO: PROBLEM??
        this.exec.execute(new TestTask(this.myInt+1, this.exec));
    }
}

public static void main(String[] args) {
    int NTHREADS =2;
    final ExecutorService service= Executors.newFixedThreadPool(NTHREADS);
    //run tasks
    for(int i=0; i<10; i++){
        service.execute(new TestTask(i, service) );
    }
    //...
}
//....
[编辑:已解决] 结果我在for循环之后调用了shutdown()

    for(int i=0; i<10; i++){
        service.execute(new TestTask(i, service) );
    }
    service.shutdown();

for(int i=0;i您可以将
ThreadPoolExecutor
子类化,并在其中包含重新提交逻辑。这将更加优雅。
ThreadPoolExecutor
设计精良,提供钩子方法来完成您需要的操作。您可能希望覆盖该异常:

  • 遗嘱执行人已被关闭
  • 您超过了最大队列大小
如果不看代码,我们无法判断,但很可能您在隐藏代码中执行了这两种操作之一(甚至可能在
main
),您必须修复它(顺便说一句,此行为可以通过自定义)


我不知道这个问题是您的实际问题还是示例问题,但无论如何,我认为一个任务生成另一个任务不是常见的做法。您最好重新构造代码,使调用方自己在必要时提交一个新任务。这并不是说它会解决您的问题,而是肯定会改进程序的设计。如果您请描述您的域,也许我们也能帮上忙。

我无法复制此内容。请发布完整的堆栈跟踪。@SotiriosDelimanolis,已添加。您是否在未显示的代码中关闭了池?它在此处运行时没有问题。使用java8@Raffaele,是的,我打电话给shutdown()在for循环之后。一旦我删除它,异常就会消失。这会有什么影响?谢谢@Raffaele,这是练习的示例代码。在未显示的代码中,我调用了shutdown()就在for循环之后。一旦我删除了它,代码就会毫无问题地运行。因此,异常似乎是在ExecutorService关闭后处理的——难道shutdown()不应该在所有任务完成后生效吗?@pdxhiker From the javadoc:
shutdown())启动有序关机,执行以前提交的任务,但不接受新任务。
    for(int i=0; i<10; i++){
        service.execute(new TestTask(i, service) );
    }
    service.shutdown();