从正在运行的任务提交给执行者

时间:2014-04-25 13:22:13

标签: java multithreading deadlock

Executor运行任务(Runnable)提交(execute())任务是否安全?如果使用任何标准Java执行程序,它会导致死锁吗?我应该使用任何特定的配置,或者如果我想防止死锁,为标准执行器避免?我猜测将任务提交给不同的执行者是安全的,但是如何将任务提交给执行原始任务的执行者呢?

3 个答案:

答案 0 :(得分:0)

如果存在死锁,则会根据已部署的runnable中的条件创建死锁。 ExecutorService本身只是一个可重用的线程池。它处理排队runnables执行。无论Runnables源自何处,ExecutorService本身都没有理由陷入僵局。

答案 1 :(得分:0)

  

Executor运行的任务(Runnable)提交(执行())任务是否安全?

如果它不会创建太多任务以使系统过载,那么它是安全的。例如如果你有一个任务创建两个任务,他们创建两个任务......

  

如果使用任何标准Java执行程序,是否会导致死锁?

Executors是线程安全的,任务被添加到队列中。

  

我是否应该使用任何特定配置,或者如果我想防止死锁,请避免使用标准执行程序?

您可以使用一个线程和一个SynchronousQueue创建一个ThreadPoolExecutor,这可以阻止自己。但我不会这样做。 ;)

  

我猜测将一个任务提交给另一个执行者是安全的,但是如何将任务提交给执行原始任务的执行者呢?

如果您有以下任何一种情况,则不会有任何问题。通常你拥有所有这些

  • 不断增长的队列
  • 如果无法添加,则执行失败,即不阻止
  • 可扩展的线程池

答案 2 :(得分:0)

如果你打电话获取未来然后你肯定会死锁,在简单的例子中如下所示这可能是显而易见的,但如果你有一些隐藏执行者使用的类层次结构,那么有人会错误地引入这样的错误。

class TestApp {
    public static class MyCallable
            implements Callable {
        public Integer call() throws ExecutionException, InterruptedException {
            Future<Integer> future = pool.submit(new MyCallable());
            System.out.println("MyCallable: before get 2");
            future.get(); // deadlocks here
            System.out.println("MyCallable: after get 2");
            return 0;
        }
    }

    static ExecutorService pool = Executors.newSingleThreadExecutor();
    public static void main(String [] args) throws ExecutionException, InterruptedException {
        Future<Integer> future = pool.submit(new MyCallable());
        System.out.println("MyCallable: before get 1");
        future.get();
        System.out.println("MyCallable: after get 1");
    }
}

打印

MyCallable: before get 1
MyCallable: before get 2
MyCallable: before get 2
MyCallable: before get 2