java - 这些线程在哪个对象上同步

标签 java multithreading monitor synchronized

我想同步通过 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 个线程对其执行操作。

最佳答案

  1. 您无法向 Executor 服务提交线程;您提交任务,这些任务将在稍后某个时刻在执行器线程池中的线程之一上执行;

  2. 如果一个任务是生产者,另外两个任务是消费者,那么将所有三个任务提交给执行器是错误的。它很容易导致死锁,即消费者任务无限期地等待生产者,但生产者无法运行,因为消费者占用了所有线程。

重新考虑你的解决方案,让生产者任务也负责将消费者任务提交给执行者;任务可以用产生的值来实例化,因此协调问题从一开始就解决了。

关于java - 这些线程在哪个对象上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22759934/

相关文章:

java - java中的jar文件中的一些问题

c++ - 采访 : what is the difference between pthread and windows thread created by _beginthread(ex)?

c# - 如何知道应用程序正在关闭

python - FT2232h/FT42232h 兼容全双工串行监视器

java - 使用 Spring Data JPA 查找实体时如何启用 LockModeType.PESSIMISTIC_WRITE?

java - 是否可以设置 Selenium Webdriver 在遇到错误时进行屏幕捕获

java - JBPM 到 Drools Flow - 是否有记录的迁移路径?

c++ - 如何在类中使用数组变量? C++

mysql - 将 MySQL 表转换为 Cassandra 中的 ColumnFamily : Slow batch mutations with Hector

monitor - 纵向使用宽屏显示器对编码更有效吗?