从正在运行的任务提交给执行者[英] Submitting to an Executor from a running task

问题描述

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

推荐答案

如果有僵局,它将由您已部署的可运行的条件创建.执行人员服务本身只是可重复使用的线程池.它处理排队运行可执行.无论可运行者的起源在哪里.

其他推荐答案

执行人运行的任务(可运行)是否安全提交(execute())任务?

,如果它不会创建太多的任务以使系统超载,那是安全的.例如如果您有一个创建两个任务并创建两个任务的任务...

如果使用任何标准Java执行者,它会导致死锁吗?

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

对于标准执行人,我应该使用任何特定的配置,或者避免防止死锁吗?

您可以使用一个线程和一个同步器创建一个ThreadPoolExecutor,这可能会阻止自身.但是我不会那样做. ;)

我猜想将任务提交给其他执行人是安全的,但是将任务提交给执行原始任务的执行人呢?

提供以下任何内容,您不会有问题.通常,您都有所有这些

  • 越来越长的队列
  • 执行失败如果无法添加,即不封锁
  • 可扩展的线程池

其他推荐答案

如果您在将来打电话,那么您肯定可以僵局,例如,在下面的简单示例中,发现可能很明显,但是如果您有一些类层次结构来隐藏执行者的用法,那么某人错误地会引入此类错误.

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

本文地址:https://www.itbaoku.cn/post/978627.html