学习过程观看视频:[狂神说Java]
https://www.bilibili.com/video/BV1B7411L7tE?p=13
欢迎大家支持噢,很良心的老师了!
同步队列-SynchronousQueue解释:
java代码示例:
package com.add;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
/**
* Created by zjl
* 2020/11/25
**/
public class SynchronousQueueTest {
public static void main(String[] args) {
BlockingQueue<String> blockingQueue = new SynchronousQueue<>();
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName() + "put 1");
blockingQueue.put("1");
System.out.println(Thread.currentThread().getName() + "put 2");
blockingQueue.put("2");
System.out.println(Thread.currentThread().getName() + "put 3");
blockingQueue.put("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
},"放入线程").start();
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName() + "=======》" + blockingQueue.take());
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName() + "=======》" + blockingQueue.take());
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName() + "=======》" + blockingQueue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
},"取出线程").start();
}
}
输出结果:
放入线程put 1
取出线程=======》1
放入线程put 2
取出线程=======》2
放入线程put 3
取出线程=======》3
解释说明:
根据上面的代码示例,第一个线程会在第二个线程取之前全部都放进队列才对,因为第二条队列我们进行了睡眠1s,这段时间足以让第一个线程将所有数据放入队列,但是结果并不是这样,而是先放进去一个对象,取出一个对象之后再次放入一个对象,说明我们的同步队列里面只能存放一个对象。