多线程(阻塞队列)

发布时间 2023-03-22 21:17:27作者: zl子路

阻塞队列(BlockingQueue)

体系

阻塞队列是collection单列集合体系下的一个接口有两个实现类

ArrayBlockingQueue(数组,有界)和LinkedBlockingQueue(链表,无界,最大值未int最大值)

常用方法

put(anObject)将参数放入队列,如果放不下会阻塞

take()取出第一个数据,取不到会阻塞

利用阻塞队列实现等待唤醒机制(其自带锁不用额外添加锁,否则可能会导致死锁)


import java.util.concurrent.ArrayBlockingQueue;

public class Test {

//结束条件
public static int count=10;
public static void main(String[] args) {
ArrayBlockingQueue<String> abq=new ArrayBlockingQueue<>(1);

Cook cook = new Cook(abq);
Foodie foodie = new Foodie(abq);


cook.start();
foodie.start();



}
}
 
import java.util.concurrent.ArrayBlockingQueue;

public class Cook extends Thread {
ArrayBlockingQueue<String> abq;

public Cook(ArrayBlockingQueue<String> abq) {
this.abq = abq;
}


@Override
public void run() {
while (true) {

try {
abq.put("面条");
if (Test.count == 0) {
System.out.println("你已经吃完");
break;
}
System.out.println("做了一碗面条");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}
 
import java.util.concurrent.ArrayBlockingQueue;

public class Foodie extends Thread {
ArrayBlockingQueue<String> abq;

public Foodie(ArrayBlockingQueue<String> abq) {
this.abq = abq;
}



@Override
public void run() {
while (true) {

try {

String take = abq.take();
System.out.println(take);
Test.count--;
if (Test.count == 0) {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}


}
}
}