特点:阻塞队列,此队列有点特殊,没有存储空间,也就是不存储数据。每一个put操作必须等待一个take操作,反之,每一个take操作也必须等待一个put操作。如果put进去一个数据,那么必须等待这条数据被take走才put操作才算是执行完成。
应用场景:目前没有想到我碰到的场景,尴尬,但感觉就好比,一个人去相亲,一直等着另一方,只有另一方来了,两个人才可以手牵手一起走,不然就一直等着,有种同步执行的感觉。
代码案例:
package com.example.web.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;
@RestController
public class HomeController {
@RequestMapping("/index")
public String index() throws Exception {
SynchronousQueue queue = new SynchronousQueue<>();
//生产者
new Thread(() ->
{
try {
TimeUnit.MILLISECONDS.sleep(3000);
System.out.println("生产者begin");
queue.put("测试数据");
//queue.offer("测试数据", 5, TimeUnit.SECONDS);
System.out.println("生产者end");
} catch (Exception ex) {
}
}).start();
//消费者
new Thread(() ->
{
try {
//TimeUnit.MILLISECONDS.sleep(3000);
System.out.println("消费者begin");
String aa = queue.take();
//String aa = queue.poll(5, TimeUnit.SECONDS);
System.out.println("消费者end" + aa);
} catch (Exception ex) {
}
}).start();
//主线程也等待下
TimeUnit.SECONDS.sleep(10);
return "网站已得到响应";
}
}
添加方法除了put()还有offer(),offer方法不会阻塞线程,有返回结果来判断是否接受数据成功。可传入参数,参数含义就是存在队列中的时间,如果到时间没有相对的操作来执行就会过期返回false。
take()还有poll()这两个方法也是一样的,用poll需要添加参数,如果不添加参数就是不等待直接获取,获取不到就是null值。如果有参数表示在规定时间内等待,在等待时间内有put操作则马上返回值,超过规定时间无put操作就返回null。
在new SynchronousQueue()时可以传递参数,bool类型,表示是否公平排序策略,这个公平排序就是后面来的操作上有序还是无序(说无序其实还是有序)。公平就是FIFO(先进先出),非公平就是LIFO(后进先出)。
参考链接:
https://www.cnblogs.com/duanxz/p/3252267.html
https://blog.csdn.net/hudashi/article/details/7076814