三種方式實現生產者和消費者模式

方式一:同步關鍵字實現

//用同步實現wait/notifyAll
public class Stroge {
    private LinkedList<String> list;
    private int maxSize;

    public Stroge(LinkedList<String> list, int maxSize) {
        this.list = list;
        this.maxSize = maxSize;
    }

    public void produce() {
        try {
            synchronized (list) {
                while (list.size() == maxSize) {
                    list.wait();
                }
                list.add("生產一個任務");
                System.out.println(Thread.currentThread().getName() + "生產一個");
                list.notifyAll();
            }
        } catch (InterruptedException e) {
        }
    }

    public String consume() {

        try {
            synchronized (list) {
                while (list.size() == 0) {
                    list.wait();
                }
                String consume = list.remove();
                System.out.println(Thread.currentThread().getName() + "消費一個");
                list.notifyAll();
                return consume;
            }
        } catch (InterruptedException e) {
            return null;
        }
    }

    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();

        Stroge stroge = new Stroge(linkedList, 10);
        Consumer consumer1 = new Consumer(stroge);
        Consumer consumer2 = new Consumer(stroge);
        Producer producer1 = new Producer(stroge);
        Producer producer2 = new Producer(stroge);
        Thread consumerThread1 = new Thread(consumer1);
        Thread consumerThread2 = new Thread(consumer2);
        Thread produceThread1 = new Thread(producer1);
        Thread produceThread2 = new Thread(producer2);
        consumerThread1.start();
        consumerThread2.start();
        produceThread1.start();
        produceThread2.start();


    }
}

class Producer implements Runnable {

    private Stroge stroge;

    public Producer(Stroge stroge) {
        this.stroge = stroge;
    }

    public void run() {
        while (true) {
            stroge.produce();
        }
    }

}

class Consumer implements Runnable {
    private Stroge stroge;

    public Consumer(Stroge stroge) {
        this.stroge = stroge;
    }

    public void run() {
        while (true) {
            stroge.consume();
        }
    }

}

方式二:鎖實現

//鎖實現
public class Stroge {
    private ReentrantLock lock = new ReentrantLock();
    private Condition full = lock.newCondition();
    private Condition empty = lock.newCondition();
    private LinkedList<String> list;
    private int maxSize;

    public Stroge(LinkedList<String> list, int maxSize) {
        this.list = list;
        this.maxSize = maxSize;
    }

    public void produce() {
        try {
            lock.lock();
            //滿了則則阻塞
            while (list.size() == maxSize) {
                full.await();
            }
            list.add("生產一個任務");
            System.out.println(Thread.currentThread().getName() + "生產一個");
            empty.signal();

        } catch (InterruptedException r) {

        } finally {
            lock.unlock();
        }
    }

    public String consume() {
        try {
            lock.lock();
            //爲空則阻塞
            while (list.size() == 0) {
                empty.await();
            }
            String consume = list.remove();
            System.out.println(Thread.currentThread().getName() + "消費一個");
            full.signal();
            return consume;
        } catch (InterruptedException e) {
            return null;
        } finally {
            lock.unlock();
        }

    }

    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        Stroge stroge = new Stroge(linkedList, 10);
        Consumer consumer1 = new Consumer(stroge);
        Consumer consumer2 = new Consumer(stroge);
        Producer producer1 = new Producer(stroge);
        Producer producer2 = new Producer(stroge);
        Thread consumerThread1 = new Thread(consumer1);
        Thread consumerThread2 = new Thread(consumer2);
        Thread produceThread1 = new Thread(producer1);
        Thread produceThread2 = new Thread(producer2);
        consumerThread1.start();
        consumerThread2.start();
        produceThread1.start();
        produceThread2.start();

    }
}

class Producer implements Runnable {

    private Stroge stroge;

    public Producer(Stroge stroge) {
        this.stroge = stroge;
    }

    public void run() {
        while (true) {
            stroge.produce();
        }
    }

}

class Consumer implements Runnable {
    private Stroge stroge;

    public Consumer(Stroge stroge) {
        this.stroge = stroge;
    }

    public void run() {
        while (true) {
            stroge.consume();
        }
    }

}

方式三:阻塞隊列實現

public class Stroge {
    private LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(10);

    public void produce() {
        try {
            //滿了則會阻塞
            queue.put("生產了一個任務");
            System.out.println(Thread.currentThread().getName() + "生產一個");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public String consume() {
        try {
            //空了則會阻塞
            String consume = queue.take();
            System.out.println(Thread.currentThread().getName() + "消費一個");
            return consume;
        } catch (InterruptedException e) {
            e.printStackTrace();
            return null;
        }

    }

    public static void main(String[] args) {
        Stroge stroge = new Stroge();
        Producer producer = new Producer(stroge);
        Consumer consumer = new Consumer(stroge);
        Thread consumer1 = new Thread(consumer);
        Thread producer1 = new Thread(producer);
        Producer producer2 = new Producer(stroge);
        Consumer consumer2 = new Consumer(stroge);
        Thread consumer22 = new Thread(consumer2);
        Thread producer22 = new Thread(producer2);
        consumer1.start();
        producer1.start();
        consumer22.start();
        producer22.start();
    }
}

class Producer implements Runnable {
    private Stroge stroge;

    public Producer(Stroge stroge) {
        this.stroge = stroge;
    }

    public void run() {
        while (true) {
            stroge.produce();
        }
    }

}

class Consumer implements Runnable {

    private Stroge stroge;

    public Consumer(Stroge stroge) {
        this.stroge = stroge;
    }

    public void run() {
        while (true) {
            stroge.consume();
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章