我想同步通过 ExecutorService 调用的 3 个线程。如何确保它们在同一对象上同步?
现在我有这个代码:
class Test {
executor.submit(new Request(threadNames[i]));
executor.submit(new Request(threadNames[i]));
executor.submit(new Request(threadNames[i]));
private class Request implements Callable {
@Override
public Long call() throws InterruptedException {
if (threadName.equals("SOMETHING") {
doSomething();
} else {
doSomeOtherThing();
}
}
}
private synchronized void doSomething() {
}
private synchronized void doSomeOtherThing() {
}
...
}
其中一个线程负责生成条件,另外 2 个线程对其执行操作。
最佳答案
您无法向 Executor 服务提交线程;您提交任务,这些任务将在稍后某个时刻在执行器线程池中的线程之一上执行;
如果一个任务是生产者,另外两个任务是消费者,那么将所有三个任务提交给执行器是错误的。它很容易导致死锁,即消费者任务无限期地等待生产者,但生产者无法运行,因为消费者占用了所有线程。
重新考虑你的解决方案,让生产者任务也负责将消费者任务提交给执行者;任务可以用产生的值来实例化,因此协调问题从一开始就解决了。
关于java - 这些线程在哪个对象上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22759934/