synchronousqueue场景_java并发队列之SynchronousQueue
特點(diǎn):阻塞隊(duì)列,此隊(duì)列有點(diǎn)特殊,沒有存儲(chǔ)空間,也就是不存儲(chǔ)數(shù)據(jù)。每一個(gè)put操作必須等待一個(gè)take操作,反之,每一個(gè)take操作也必須等待一個(gè)put操作。如果put進(jìn)去一個(gè)數(shù)據(jù),那么必須等待這條數(shù)據(jù)被take走才put操作才算是執(zhí)行完成。
應(yīng)用場(chǎng)景:目前沒有想到我碰到的場(chǎng)景,尷尬,但感覺就好比,一個(gè)人去相親,一直等著另一方,只有另一方來了,兩個(gè)人才可以手牽手一起走,不然就一直等著,有種同步執(zhí)行的感覺。
代碼案例:
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<>();
//生產(chǎn)者
new Thread(() ->
{
try {
TimeUnit.MILLISECONDS.sleep(3000);
System.out.println("生產(chǎn)者begin");
queue.put("測(cè)試數(shù)據(jù)");
//queue.offer("測(cè)試數(shù)據(jù)", 5, TimeUnit.SECONDS);
System.out.println("生產(chǎn)者end");
} catch (Exception ex) {
}
}).start();
//消費(fèi)者
new Thread(() ->
{
try {
//TimeUnit.MILLISECONDS.sleep(3000);
System.out.println("消費(fèi)者begin");
String aa = queue.take();
//String aa = queue.poll(5, TimeUnit.SECONDS);
System.out.println("消費(fèi)者end" + aa);
} catch (Exception ex) {
}
}).start();
//主線程也等待下
TimeUnit.SECONDS.sleep(10);
return "網(wǎng)站已得到響應(yīng)";
}
}
添加方法除了put()還有offer(),offer方法不會(huì)阻塞線程,有返回結(jié)果來判斷是否接受數(shù)據(jù)成功。可傳入?yún)?shù),參數(shù)含義就是存在隊(duì)列中的時(shí)間,如果到時(shí)間沒有相對(duì)的操作來執(zhí)行就會(huì)過期返回false。
take()還有poll()這兩個(gè)方法也是一樣的,用poll需要添加參數(shù),如果不添加參數(shù)就是不等待直接獲取,獲取不到就是null值。如果有參數(shù)表示在規(guī)定時(shí)間內(nèi)等待,在等待時(shí)間內(nèi)有put操作則馬上返回值,超過規(guī)定時(shí)間無put操作就返回null。
在new?SynchronousQueue()時(shí)可以傳遞參數(shù),bool類型,表示是否公平排序策略,這個(gè)公平排序就是后面來的操作上有序還是無序(說無序其實(shí)還是有序)。公平就是FIFO(先進(jìn)先出),非公平就是LIFO(后進(jìn)先出)。
參考鏈接:
https://www.cnblogs.com/duanxz/p/3252267.html
https://blog.csdn.net/hudashi/article/details/7076814
總結(jié)
以上是生活随笔為你收集整理的synchronousqueue场景_java并发队列之SynchronousQueue的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mfc控件变量没定义_WinCC字符串归
- 下一篇: abb外部轴零位校准_ABB机器人如何控