最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java wait和notifyAll實(shí)現(xiàn)簡單的阻塞隊(duì)列

 更新時(shí)間:2019年10月19日 11:14:58   作者:我不是一個(gè)小菜鳥  
這篇文章主要介紹了Java wait和notifyAll實(shí)現(xiàn)簡單的阻塞隊(duì)列,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

wait,會(huì)使調(diào)用的線程進(jìn)入等待狀態(tài),會(huì)釋放所持有的對象鎖(調(diào)用的時(shí)候也必須先獲取到鎖,否則會(huì)拋出異常 IllegalMonitorStateException)

notifyAll、notify,會(huì)去喚醒應(yīng)當(dāng)前對象而等待的線程,(調(diào)用的時(shí)候也必須先獲取到鎖,否則會(huì)拋出異常 IllegalMonitorStateException)

順便也記錄一下join方法,調(diào)用join方法,會(huì)使當(dāng)前線程進(jìn)入等待,如果沒有設(shè)置等待時(shí)間,就會(huì)等待另一個(gè)線程執(zhí)行完成才返回(ps:調(diào)用join方法并不一定立刻執(zhí)行另一個(gè)線程,只是當(dāng)前線程進(jìn)入等待,然后切換下一個(gè)線程)

import java.util.concurrent.atomic.AtomicInteger;
/**
 * @author lhd
 */
public class BlockQueue {
	/**
  * 生產(chǎn)者鎖對象
  */
	private final Object addLock = new Object();
	/**
  * 消費(fèi)者鎖對象
  */
	private final Object deleteLock = new Object();
	/**
  * 隊(duì)列總大小
  */
	private final Integer size = 30;
	/**
  * 數(shù)據(jù)存放
  */
	private Object[] queue = new Object[size];
	/**
  * 存放的數(shù)量,使用AtomicInteger是因?yàn)槠胀ǖ膇nt遞增遞減操作會(huì)存在非原子性的問題,會(huì)使數(shù)量異常
  */
	private AtomicInteger count = new AtomicInteger(0);
	/**
  * 生產(chǎn)
  * @param o 對象
  */
	public void add(Object o) {
		//獲取生產(chǎn)鎖,wait方法必須獲取到對象鎖后才可以調(diào)用,否則拋出異常
		synchronized (addLock){
			//判斷是否超過隊(duì)列大小,超過則進(jìn)入等待
			while (count.get() >= size){
				try {
					addLock.wait();
				}
				catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			//存放一個(gè)
			queue[count.get()] = o;
			//遞增
			int i = count.incrementAndGet();
			//打印一下日志
			String name = Thread.currentThread().getName();
			System.out.println(name + "生產(chǎn)了一個(gè),現(xiàn)有數(shù)量" + i);
		}
		//如果隊(duì)列有數(shù)據(jù),則調(diào)用notifyAll喚醒消費(fèi)者
		if (count.get() >= 1){
			//notifyAll、notify都需要先獲取對象鎖,否則會(huì)拋出異常
			synchronized (deleteLock){
				deleteLock.notifyAll();
			}
		}
	}
	/**
  * 消費(fèi)
  * @return
  */
	public Object poll(){
		Object o;
		//先獲取對象鎖,和生產(chǎn)者類似
		synchronized (deleteLock){
			//隊(duì)列里沒有數(shù)據(jù)則等待
			while (count.get() <= 0){
				try {
					deleteLock.wait();
				}
				catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			//獲取數(shù)據(jù)
			o = queue[count.get()];
			//遞減
			int i = count.decrementAndGet();
			String name = Thread.currentThread().getName();
			System.out.println(name + "消費(fèi)了一個(gè),現(xiàn)有數(shù)量" + i);
		}
		//如果隊(duì)列沒有滿,則可以喚醒生產(chǎn)者
		if (count.get() < size){
			//需要先獲取到鎖
			synchronized (addLock){
				addLock.notifyAll();
			}
		}
		return o;
	}
	/**
  * 簡單的測試
  * @param args
  */
	public static void main(String[] args) {
		BlockQueue blockQueue = new BlockQueue();
		Thread t1 = new Thread(()-> {
			while (true){
				blockQueue.add(new Object());
			}
		}
		);
		Thread t2 = new Thread(()-> {
			while (true){
				blockQueue.add(new Object());
			}
		}
		);
		Thread t3 = new Thread(()-> {
			while (true){
				blockQueue.add(new Object());
			}
		}
		);
		Thread t4 = new Thread(()-> {
			while (true){
				blockQueue.poll();
			}
		}
		);
		Thread t5 = new Thread(()-> {
			while (true){
				blockQueue.poll();
			}
		}
		);
		Thread t6 = new Thread(()-> {
			while (true){
				blockQueue.poll();
			}
		}
		);
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
		t6.start();
	}
}

效果:其實(shí)這個(gè)遞增遞減操作和打印操作也不是原子操作

依次打印線程1,2,3

/**
 * @author lhd
 */
public class JoinTest {


 public static void main(String[] args) throws InterruptedException {
  Thread t1 = new Thread(() -> System.out.println(1));
  Thread t2 = new Thread(()-> System.out.println(2));
  Thread t3 = new Thread(()-> System.out.println(3));

  t1.start();
  t1.join();

  t2.start();
  t2.join();

  t3.start();
  t3.join();
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC中@RequestMapping注解用法實(shí)例

    SpringMVC中@RequestMapping注解用法實(shí)例

    通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 利用Java讀取Word表格中文本和圖片的方法實(shí)例

    利用Java讀取Word表格中文本和圖片的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于如何利用Java讀取Word表格中文本和圖片的相關(guān)資料,主要利用的是free spire.doc.jar 包,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • Java使用ObjectMapper的簡單示例

    Java使用ObjectMapper的簡單示例

    這篇文章主要介紹了Java使用ObjectMapper的簡單示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot之跨域過濾器配置允許跨域訪問方式

    SpringBoot之跨域過濾器配置允許跨域訪問方式

    這篇文章主要介紹了SpringBoot之跨域過濾器配置允許跨域訪問方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 利用idea快速搭建一個(gè)spring-cloud(圖文)

    利用idea快速搭建一個(gè)spring-cloud(圖文)

    本文主要介紹了idea快速搭建一個(gè)spring-cloud,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與OJ題

    Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與OJ題

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與OJ題,本文章先是對隊(duì)列進(jìn)行介紹,后又介紹了四道OJ相關(guān)的題目,來使其深入理解,需要的朋友可以參考下
    2023-01-01
  • Spring Cloud Ribbon負(fù)載均衡器處理方法

    Spring Cloud Ribbon負(fù)載均衡器處理方法

    這篇文章主要介紹了Spring Cloud Ribbon負(fù)載均衡器處理方法,看看是如何獲取服務(wù)實(shí)例,獲取以后做了哪些處理,處理后又是如何選取服務(wù)實(shí)例的,需要的朋友可以參考下
    2018-02-02
  • SpringCloud客戶端報(bào)錯(cuò):- was unable to send heartbeat!的解決

    SpringCloud客戶端報(bào)錯(cuò):- was unable to send&nb

    這篇文章主要介紹了SpringCloud客戶端報(bào)錯(cuò):- was unable to send heartbeat!的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 在JPA中criteriabuilder使用or拼接多個(gè)like語句

    在JPA中criteriabuilder使用or拼接多個(gè)like語句

    這篇文章主要介紹了在JPA中criteriabuilder使用or拼接多個(gè)like語句,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java實(shí)現(xiàn)多項(xiàng)式乘法代碼實(shí)例

    Java實(shí)現(xiàn)多項(xiàng)式乘法代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)多項(xiàng)式乘法代碼實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10

最新評論

邯郸市| 上虞市| 哈巴河县| 德安县| 泰宁县| 加查县| 灵台县| 勃利县| 本溪市| 乳源| 班戈县| 湾仔区| 元阳县| 阳山县| 越西县| 兖州市| 黑河市| 蒙阴县| 南投县| 微山县| 夹江县| 吉安市| 鹰潭市| 宝山区| 浦县| 定结县| 阿克| 班戈县| 北碚区| 天祝| 镇远县| 湘阴县| 光山县| 合川市| 铁力市| 游戏| 唐山市| 亳州市| 岚皋县| 师宗县| 峡江县|