1. 程式人生 > >java 多線程四

java 多線程四

current rup tap oid days else repos print get

java 多線程一

java 多線程二

java 多線程三

java 多線程四

一個生產者,消費者的例子:

import java.util.Stack;

/**
 * Created by root on 17-10-1.
 */
public class Test5 {

    //商品:APPLE
    class Apple {
        private int id;

        public Apple(int id) {
            this.id = id;
        }

        @Override
        public String toString() {
            return "Apple{" +
                    "id=" + id +
                    ‘}‘;
        }
    }

    //存放商品的倉庫
    class Repositorie {
        Stack<Apple> capacity = new Stack<>();
        int MAXSIZE = 10;

        public synchronized void putApple(Apple apple) throws InterruptedException {
            if (capacity.size() < MAXSIZE) {
                capacity.push(apple);
                System.out.println(Thread.currentThread().getName()+"生產Apple>>>" + apple.toString());
                notify();
            } else {
                wait();
            }
        }

        public synchronized void getApple() throws InterruptedException {
            if (capacity.size() > 0) {
                System.out.println("      "+Thread.currentThread().getName()+"消費Apple<<<" + capacity.pop().toString());
                notify();
            } else {
                wait();
            }
        }

        public void close(){
            while (true){
                //賣完了就打烊
                if (capacity.size()==0){
                    System.exit(0);
                }

            }

        }
    }


    //生產者
    class Producer implements Runnable {
        int NUM=20;//一共生產20個商品
        private Repositorie repositorie;

        public Producer(Repositorie repositorie) {
            this.repositorie = repositorie;
        }

        @Override
        public void run() {

            for (; NUM>0; ) {
                try {
                    repositorie.putApple(new Apple(NUM--));
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            repositorie.close();
        }
    }

    //消費者
    class Consume implements Runnable {

        private Repositorie repositorie;

        public Consume(Repositorie repositorie) {
            this.repositorie = repositorie;
        }

        @Override
        public void run() {
            //不知道有多少商品
            for (;true;) {
                try {
                    repositorie.getApple();
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }


    public static void main(String[] args) {
        Test5 test5 = new Test5();
        Repositorie repositorie = test5.new Repositorie();
        Producer producer = test5.new Producer(repositorie);
        Consume consume = test5.new Consume(repositorie);
        Thread p1 = new Thread(producer,"工人1");
        Thread p2 = new Thread(producer,"工人2");
        Thread c1 = new Thread(consume,"客戶1");
        Thread c2 = new Thread(consume,"客戶2");
        p1.start();
        p2.start();
        c1.start();
        c2.start();
    }
}

結果:

工人1生產Apple>>>Apple{id=20}
工人2生產Apple>>>Apple{id=19}
      客戶2消費Apple<<<Apple{id=19}
      客戶1消費Apple<<<Apple{id=20}
工人1生產Apple>>>Apple{id=18}
工人2生產Apple>>>Apple{id=17}
工人1生產Apple>>>Apple{id=16}
工人2生產Apple>>>Apple{id=15}
工人1生產Apple>>>Apple{id=14}
      客戶1消費Apple<<<Apple{id=14}
      客戶2消費Apple<<<Apple{id=15}
工人2生產Apple>>>Apple{id=13}
工人1生產Apple>>>Apple{id=12}
工人2生產Apple>>>Apple{id=11}
工人1生產Apple>>>Apple{id=10}
工人2生產Apple>>>Apple{id=9}
工人1生產Apple>>>Apple{id=8}
      客戶1消費Apple<<<Apple{id=8}
      客戶2消費Apple<<<Apple{id=9}
工人2生產Apple>>>Apple{id=7}
工人1生產Apple>>>Apple{id=6}
工人2生產Apple>>>Apple{id=5}
      客戶1消費Apple<<<Apple{id=5}
      客戶2消費Apple<<<Apple{id=6}
工人1生產Apple>>>Apple{id=2}
工人2生產Apple>>>Apple{id=1}
      客戶1消費Apple<<<Apple{id=1}
      客戶2消費Apple<<<Apple{id=2}
      客戶1消費Apple<<<Apple{id=7}
      客戶2消費Apple<<<Apple{id=10}
      客戶1消費Apple<<<Apple{id=11}
      客戶2消費Apple<<<Apple{id=12}
      客戶1消費Apple<<<Apple{id=13}
      客戶2消費Apple<<<Apple{id=16}
      客戶1消費Apple<<<Apple{id=17}
      客戶2消費Apple<<<Apple{id=18}

java 多線程四