Java线程 - 使用sleep和continue的Single-Producer和Consumer

时间:2016-09-29 11:08:44

标签: java multithreading thread-safety producer-consumer double-checked-locking

我试图解决单一生产者和消费者问题,根据维基百科的问题陈述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();
    }

}

0 个答案:

没有答案