java多線程之生產者-消費者使用阻塞隊列實現

package com.zhong.thread;

import java.util.Random;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * 使用阻塞隊列實現生產者-消費者
 */
public class BlockQueue {
    public static void main(String[] args) {
        LinkedBlockingDeque<String> link = new LinkedBlockingDeque<>(8);
        Thread father= new Father(link, "老爸");
        father.start();
        new Son(link,"兒子").start();
        //father.interrupt(); 設置father線程的中斷標誌爲true

    }
}

/**
 * 消費者
 */
class Son extends Thread{

    LinkedBlockingDeque<String> link = new LinkedBlockingDeque<>(8);

    private String name ;//線程名稱

    public Son(LinkedBlockingDeque<String> link,String name){
        this.link = link;
        this.name = name;
    }

    @Override
    public void run() {

       while(!isInterrupted()){
           try{
               String str = link.take();//link沒有內容,會自動阻塞,直到可以獲得內容or被中斷

               System.out.println(name + "從隊列裏面拿了"+str);
               Thread.sleep(new Random().nextInt(1000));
           }catch (InterruptedException e){
               e.printStackTrace();
               //被中斷退出
               break;
           }
       }

    }
}

/**
 * 生產者
 */
class Father extends Thread{

    LinkedBlockingDeque<String> link = new LinkedBlockingDeque<>(8);
    private String name ;//線程名稱

    public Father(LinkedBlockingDeque<String> link,String name){
        this.link = link;
        this.name = name;
    }

    @Override
    public void run() {
        while(!isInterrupted()){
            try{
                link.put("財富");//超過link容量,自動阻塞直到可以放入內容or被中斷
                System.out.println(name + "向隊列裏面放了財富");
                Thread.sleep(new Random().nextInt(1000));
            }catch (InterruptedException e){
                e.printStackTrace();
                //被中斷退出
                break;
            }
        }
    }
}

 

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