我打算在生产者和消费者线程之间编写一个共享缓冲区。这是我的代码:
class PQueue
{
Token token;
boolean flag = false; // false: add, true: poll
PQueue()
{
token = null;
}
synchronized void add(Token token)
{
if(flag == true)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = true;
notify();
this.token = token;
}
synchronized Token poll()
{
if(flag == false)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = false;
notify();
return this.token;
}
}
我是多线程新手。是否存在潜在的并发错误?这是实现这一目标的“标准/通用”方式吗?或者有没有更简单、更有效的方法?
最佳答案
看看 java.util.concurrent
包,特别是 BlockingQueue
接口(interface)和实现它的类。这些用于将消息从一个线程传递到另一个线程。 SynchronousQueue
这正是您想要实现的。
您自己的实现有一些缺陷。其一,两个共享变量都应声明为 volatile
以确保一个线程上的更改可以被另一个线程看到。还有你的if (flag == false)
和if (flag == true)
测试实际上应该是 while
循环,因为wait()
可以wake up spuriously当notify()
实际上还没有被调用。
我建议将标记设置为 null 以指示没有对象,而不是使用单独的标志变量。而不是在InterruptedException
面前捕捉、打印、盲目继续。 ,我建议让这两种方法在发生异常时都抛出该异常。这些是阻塞方法,调用者有责任处理阻塞方法被中断的可能性。
另外,我不知道你的 Token
是什么?类是,但队列中的任何内容实际上都不取决于其类型。定义一个通用的 PQueue<T>
会更有意义,然后使用PQueue<Token>
如果你想传递 token 。
关于java - 如何实现Java线程之间的共享缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11946178/