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