[英]java producer consumer threads for monitoring audio
我正在用Java制作DAW,实际上它比这更基础,我以我曾经拥有的旧Tascam 4-Track记录器为模型进行了建模。 我正在尝试在录制时尽可能减少两者之间的延迟(延迟)的同时监视音频。 如果我在同一线程中写入音频字节,则在读取它们的过程中存在大量延迟(如果您想查看我拥有的代码,我会将其发布,但这似乎无关紧要,因为我认为需要重写) 。 我一直在考虑做的事情是使用生产者,使用者线程和队列在两者之间存储字节块。 因此,我的生产者线程可能会从TargetDataLine
读取字节并将其存储在队列中,可能使用一种返回读取字节数的方法,以便可以在while循环中检查EOF。 并创建一个并发线程,该线程获取存储在队列中的字节块(当它们是要写入的字节时),并将其写入SourceDataLine
。 我的想法是,两个同时运行的线程几乎能够在读取它们的同时写入字节,或者至少比我现在拥有的更好,但是我想知道其他人如何解决了这个问题。
我还需要确保我的使用者线程等待队列中没有字节,并在添加字节以开始再次写入字节时得到通知,如果有人发布了同步两个线程的正确方法的示例,欣赏它。 我知道它们必须位于同步代码块中,我应该使用多个锁吗? 我不是在问音频的特定示例,而只是在将示例添加到集合中然后将其删除的一般示例,我们将不胜感激。 谢谢。
在“经典” java中,您可以(并且可能应该)将单个锁定对象用于生产者-消费者实现。 就像是
public final static Object LOCK = new Object();
然后在您的Produce()方法中,您将获得如下代码:
synchronized(LOCK) {
//place stuff in queue
LOCK.notifyAll(); //wake up any sleepers
}
在消耗()方法中,您将拥有另一面:
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 。 您可以只定义一个“全局”静态队列,然后分别对produce()和consume()实现使用offer()和take()。
但是,如果您真的担心延迟,我会加倍努力,并使用专门为低延迟线程间通信编写的库。 此类库的一个很好的例子是破坏者 ,它声称延迟比ArrayBlockingQueue好得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.