我试图解决单一生产者和消费者问题,根据维基百科的问题陈述https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem 生产和消费应该无休止地发生,这样生产者不应该在满员时添加到队列中,而消费者在空的时候不应该消费
我已经使用Thread.sleep解决了它,并在无限循环中使用continue进行了双重检查并创建了两个线程,一个生产者和消费者,它似乎运行良好而没有破坏,但我没有找到其他地方推荐的解决方案,我附上了代码
我的问题是,与锁定或使用产品/消耗计数相比,此解决方案是否会中断或者是否有任何性能损失,
代码:
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Random;
class Buffer{
static final int MAX_SIZE=5;
static Deque<Integer> bufferQueue=new ArrayDeque<>();
static int produce(){
int value=new Random().nextInt(10);
bufferQueue.offer(value);
return value;
}
static int consume(){
return bufferQueue.poll();
}
}
public class BufferTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Producer Thread
new Thread(
()->{
while(true){
if(Buffer.bufferQueue.size()==Buffer.MAX_SIZE){
try {
System.out.println("Buffer Full");
Thread.sleep(2000);
continue; //Double Check
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Produced "+Buffer.produce());
}
},"Producer"
).start();
//Consumer Thread
new Thread(
()->{
while(true){
if(Buffer.bufferQueue.size()==0){
try {
System.out.println("Buffer Empty");
Thread.sleep(2000);
continue; //Double check
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Consumed "+Buffer.consume());
}
},"Consumer"
).start();
}
}