【问题标题】:Manage Queue System in multiple Threads in java在java中的多个线程中管理队列系统
【发布时间】:2014-06-12 05:08:58
【问题描述】:

我有一个请求队列。有两个线程。在线程中,我将项目添加到队列中,第二个线程基本上从队列列表中获取请求并执行它们。所以第二个线程等待第一个线程将一些请求放入列表中。我在一个while循环中这样做。我认为这不是最好的方法。它是 CPU 密集型的。每当我添加请求时,我都会想办法通知第二个线程。但可能存在请求可能无法成功执行的问题,因此我必须再次要求第二个线程执行请求。 那么您认为有什么方法可行吗?

【问题讨论】:

标签: java queue message-queue


【解决方案1】:

使用 Java 中可用的阻塞队列之一:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html

确实不建议忙着等待(除非你想用电脑取暖)。

【讨论】:

  • 他们基本上使用更“智能”的方法(例如,确实可以使用等待/通知技术来实现)。它们不是在循环中等待队列变为非空(并且在所谓的忙等待期间使用大量 CPU 利用率),而是休眠并在新元素放入队列时收到通知。
【解决方案2】:

你可以使用Semaphores来解决这个问题。

第二个线程,即工作线程将等待信号量。每次第一个线程将新任务信息推送到Queue 结构时,它也会发布到Semaphore,所以现在第二个线程可以安全地执行。

如果有多个读取器/写入器线程,这可能还需要一些同步。

【讨论】:

  • 但是等待第一个线程(生产者)将一些元素放入队列列表的方法是什么?因为我正在使用 while 循环,这肯定不是最好的方法
  • 信号量最初将设置为 0,因此第二个线程将等待/阻塞而不进行 while 循环等待。每次第一个线程将数据推送到队列时,它都会增加信号量。由于信号量现在 > 0,第二个线程可以执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2014-07-27
  • 1970-01-01
相关资源
最近更新 更多