java - 带连接的保护 block

标签 java multithreading join guard

我需要同步多个线程。我不创建线程,但我知道有多少线程。所以我写了这个内部保护 block :

private class Guard {
    int waiters = 0;
    boolean wait;
    synchronized void addWaiter() {
        ++waiters;
        wait = true;
        while (wait && waiters != threadNum()) {
            try {
                wait();
            } catch (InterruptedException e) {}
        }
        waiters = 0;
        wait = false;
        notifyAll();
    }
}

这个 protected block 在循环中执行。所以问题是,在第一次调用的所有线程从 wait() 循环中释放之前,它可能会被第二次调用,这显然会搞乱守卫的整个逻辑。所以我需要让线程在从防护中释放之前以某种方式加入。有这方面的设计吗?完成它的最优雅的方式是什么。请记住,这些线程不是我创建的。

谢谢。

最佳答案

听起来像是 CountDownLatch 的工作。您可以将锁存器设置为等待 N 次倒计时。有关示例,请参阅 Javadoc。

关于java - 带连接的保护 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4580118/

相关文章:

java - Value Animator结束时如何制作方法?

java - 需要全局清理的昂贵资源的线程安全缓存

c++ - 是否可以将重载方法传递给 std::thread

java - Java Spring框架: Multiple Threads and TaskExecutor

来自多个条目的mysql否定

mysql - 删除并出现连接错误

MySQL distinct join with multiple rows null

java - SwipeView改变2个页面的内容

java - 谷歌应用引擎: Exception while using TaskQueue with JUnit test cases

java - 我需要在子类中覆盖 CompareTo 方法