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;
}
}
}
}