synchronousqueue场景_java并发队列之SynchronousQueue
特點:阻塞隊列,此隊列有點特殊,沒有存儲空間,也就是不存儲數據。每一個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
總結
以上是生活随笔為你收集整理的synchronousqueue场景_java并发队列之SynchronousQueue的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mfc控件变量没定义_WinCC字符串归
- 下一篇: abb外部轴零位校准_ABB机器人如何控