用于监控音频的java生产者消费者线程

标签 java multithreading concurrency synchronous

我正在用 Java 制作一个 DAW,实际上它比那更基本,我按照我曾经拥有的一台旧 Tascam 4 轨录音机进行建模。我试图在录制时监控音频,并尽可能减少两者之间的延迟(延迟)。如果我在同一个线程中写入音频字节,我会在其中读取它们,这会存在大量延迟(如果您想查看我拥有的代码,我将发布它,但它似乎无关紧要,因为我认为它需要重写) 。我一直在考虑做的是使用生产者、消费者线程和队列来存储其间的字节 block 。因此我的生产者线程将从 TargetDataLine 读取字节并将它们存储在队列中,可能使用返回读取字节数的方法,以便我可以在 while 循环中检查 EOF。并创建一个并发线程,获取存储在队列中的字节 block (当它们是要写入的字节时)并将它们写入 SourceDataLine。我的想法是同时运行的两个线程将能够几乎在读取字节的同时写入字节,或者至少比我现在拥有的更好,但我想知道其他人是如何解决这个问题的。

此外,如果队列中没有字节,我还需要确保我的消费者线程等待,并且在添加字节以再次开始写入字节时收到通知,如果有人会发布同步这两个字节的正确方法的示例我将不胜感激。我知道它们必须位于同步代码块中,我应该使用多个锁吗?我并不是要求提供特定于音频的示例,只是一个将某些内容添加到集合中然后将其删除的一般示例,我们将不胜感激。谢谢。

最佳答案

在“经典”java中,您可以(并且可能应该)使用单个锁对象来实现生产者-消费者。类似的东西

public final static Object LOCK = new Object();

然后在您的 Produce() 方法中您将拥有如下代码:

synchronized(LOCK) {
   //place stuff in queue
   LOCK.notifyAll(); //wake up any sleepers
}

在你的 Consumer() 方法中你将得到另一面:

synchronized(LOCK) {
   if (anything in queue) {
      return something
   }
   //queue is empty - wait
   while (nothing in queue) { //while bit is important - we might wakeup for no reason or someone else might grab everything leaving us with nothing
      try {
         Lock.wait();
      } catch (InterruptedException ex) {
         //99% of java code ignores these spurious wakeups, and they also hardly ever really happen
      }
   }
}

但这已经是老派了。更现代版本的 java 具有为您整齐地包装所有这些低级巫术的类。例如ArrayBlockingQueue 。您可以定义一个“全局”静态队列,然后分别使用 Offer() 和 take() 来实现 Produce() 和 Consumer() 。

但如果您真的关心延迟,我会加倍努力并使用专门为低延迟线程间通信编写的库。这种库的一个很好的例子是 the disruptor声称比 ArrayBlockingQueue 的延迟要好得多。

关于用于监控音频的java生产者消费者线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15941120/

相关文章:

Java 正则表达式 : find a match only at the beginnings of words

c# - C# quartz 竞赛条件

python - 让 CherryPy 在收到键盘中断后立即退出?

Java并发生成无限数量的对象

java - 使用 java.util.concurrent.FutureTask 是不是一个好方法?

java - 如何使用改造将内部 json 字符串解析为嵌套类

java - 通过 javax.swing.text.Element 从 JTextPane 获取一个组件?

java - 如何通过改造获取 POJO 和原始响应字符串?

linux - 在GDB中调试多线程程序时如何一次继续一个线程?

java - callable 是否按顺序执行?