【问题标题】:Equivalent of await(x==0) in Java等价于 Java 中的 await(x==0)
【发布时间】:2013-02-17 21:29:25
【问题描述】:

例如,在 Pthreads 中,有可能让进程等待某个条件,例如:

<await (nr == 0 ^ nw == 0) nw++>;

有没有办法在 Java 中使用 Semaphores 以类似的方式做到这一点?等待像 nr==0 这样的条件。

【问题讨论】:

  • 我部分修复了您的代码 sn-p 的格式,因此它至少是可见的;如有必要,请编辑以使其正确。
  • 我认为条件会起作用,但我不是必须不时从另一个线程手动检查,然后通过条件发出信号吗?

标签: java concurrency pthreads semaphore


【解决方案1】:

如果是一次性事件,你可以使用a CountDownLatch:

private final CountDownLatch xIsZeroLatch = new CountDownLatch(1);

然后按如下方式使用它:

  • 在你的等待线程中:

    xIsZeroLatch.await();
    
  • 在其他线程中:

    x = newX();
    if (x == 0) xIsZeroLatch.countDown();
    

如果条件可以在 true 和 false 之间多次更改,并且每次更改都需要一个事件,则可以使用 Semaphore 并获得一次许可。

【讨论】:

    【解决方案2】:
    public void setX(int a) {
        x = a;
        if(x==0) {
             //do stuff
        }
    }
    

    然后使用该设置器代替x = a。

    【讨论】:

    • 如果涉及多个线程,您可能应该引入某种形式的同步。
    猜你喜欢
    • 2013-05-08
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2010-10-15
    • 2018-12-02
    相关资源
    最近更新 更多