java - 使用什么阻塞对象?

标签 java multithreading blocking

我需要一个阻塞对象来触发一些事件。 一个(单个)消费者应该等待触发发生。然后它会做一些事情。然后它再次等待触发。 触发器由多个不同的线程(生产者)激活。但是生产者不产生任何数据。这种触发器的语义是:“消费者必须做某事”(例如重新计算一些值,因为底层数据发生了变化)。 这意味着即使触发器被多次激活,它也应该作为单个触发器出现在消费者面前。

我考虑过使用 CountDownLatchArrayBlockingQueue , 但它们似乎不合适。

这是我想使用的触发器结构:

public class Trigger{
  private final MagicBlockingObject blockingLatch;

  public void trigger(){
     //activate the blockingLatch, so that a call to waitForTrigger() returns
  } 

  public void waitForTrigger(){
    //read from the blockingLatch. This should block until trigger() is called.
  }
}

对于 MagicBlockingObject 使用什么有什么想法吗?

BlockingQueue 似乎是合适的,但我没有找到一种方法将其限制为单个内容对象而不阻塞生产者,如果队列已满。

最佳答案

您可以使用容量为 1 的 ArrayBlockingQueue 解决此问题:

public class Trigger{
  private final ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1);

  public void trigger(){
     queue.offer("foo");
  } 

  public void waitForTrigger(){
    queue.take();
  }
}

关于java - 使用什么阻塞对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19381136/

相关文章:

java - 使用 Jersey 接收从 Android 设备发送的 JSON 变量(使用 HttpPost)

java - 用于访问私有(private) Google 电子表格并插入、更新、编辑值的 Android 代码

java - 用于多个 JSON 对象模式的 Spring IntegrationFlow

c++ - 并行填充 vector ,顺序不重要

c++ - 我怎样才能用阻塞写入cout?

iphone - 为什么ASINetworkQueue和ASIHTTPRequest阻塞了主线程?

java - 如何在对象声明中初始化 arrayList<Integer>

Java多线程应用程序只使用一个核心

c++ - cpp 主体线程的局部函数是否安全?如果是这样,从中调用静态函数呢?

java - 如何让线程停止相互阻塞写入磁盘上的日志文件?