亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

notifyAll、notify,會(huì)去喚醒應(yīng)當(dāng)前對(duì)象而等待的線程,(調(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)者鎖對(duì)象
  */
	private final Object addLock = new Object();
	/**
  * 消費(fèi)者鎖對(duì)象
  */
	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 對(duì)象
  */
	public void add(Object o) {
		//獲取生產(chǎn)鎖,wait方法必須獲取到對(duì)象鎖后才可以調(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都需要先獲取對(duì)象鎖,否則會(huì)拋出異常
			synchronized (deleteLock){
				deleteLock.notifyAll();
			}
		}
	}
	/**
  * 消費(fèi)
  * @return
  */
	public Object poll(){
		Object o;
		//先獲取對(duì)象鎖,和生產(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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • dom4j從jar包中讀取xml文件的方法

    dom4j從jar包中讀取xml文件的方法

    這篇文章主要介紹了dom4j從jar包中讀取xml文件的方法,需要的朋友可以參考下
    2014-02-02
  • SpringMVC ajax請(qǐng)求的處理方法介紹

    SpringMVC ajax請(qǐng)求的處理方法介紹

    Ajax即異步的 JavaScript和XML,是一種無需重新加載整個(gè)網(wǎng)頁的情況下,能夠更新部分模塊的網(wǎng)頁技術(shù),下面這篇文章主要給大家介紹了關(guān)于SpringMVC Ajax請(qǐng)求的處理,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • java中的轉(zhuǎn)義字符介紹

    java中的轉(zhuǎn)義字符介紹

    普通的轉(zhuǎn)義字符序列和八進(jìn)制轉(zhuǎn)義字符都比Unicode轉(zhuǎn)義字符要好得多,因?yàn)榕cUnicode轉(zhuǎn)義字符不同,轉(zhuǎn)義字符序列是在程序被解析為各種符號(hào)之后被處理的
    2013-09-09
  • Mybatis-Plus?CRUD操作方法

    Mybatis-Plus?CRUD操作方法

    通用?Service?CRUD?封裝?IService?接口,進(jìn)一步封裝?CRUD?采用?get?查詢、remove?刪除?、list?查詢集合、page?分頁的前綴命名方式區(qū)分?Mapper?層避免混淆,這篇文章主要介紹了Mybatis-Plus?CRUD的相關(guān)知識(shí),需要的朋友可以參考下
    2023-10-10
  • SpringBoot?整合mybatis+mybatis-plus的詳細(xì)步驟

    SpringBoot?整合mybatis+mybatis-plus的詳細(xì)步驟

    這篇文章主要介紹了SpringBoot?整合mybatis+mybatis-plus的步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • SpringMVC使用JsonView針對(duì)統(tǒng)一實(shí)體返回不同信息

    SpringMVC使用JsonView針對(duì)統(tǒng)一實(shí)體返回不同信息

    這篇文章主要為大家介紹了SpringMVC使用JsonView針對(duì)統(tǒng)一實(shí)體返回不同信息,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java設(shè)計(jì)模式之橋接模式的實(shí)現(xiàn)

    Java設(shè)計(jì)模式之橋接模式的實(shí)現(xiàn)

    今天給大家?guī)淼奈恼率荍ava設(shè)計(jì)模式的相關(guān)知識(shí)點(diǎn),文中對(duì)橋接模式作了非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Spring MVC學(xué)習(xí)之DispatcherServlet請(qǐng)求處理詳析

    Spring MVC學(xué)習(xí)之DispatcherServlet請(qǐng)求處理詳析

    這篇文章主要給大家介紹了關(guān)于Spring MVC學(xué)習(xí)教程之DispatcherServlet請(qǐng)求處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • java 設(shè)計(jì)模式之適配器模式的詳解

    java 設(shè)計(jì)模式之適配器模式的詳解

    這篇文章主要介紹了java 設(shè)計(jì)模式之適配器模式的詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java Http請(qǐng)求傳json數(shù)據(jù)亂碼問題的解決

    Java Http請(qǐng)求傳json數(shù)據(jù)亂碼問題的解決

    這篇文章主要介紹了Java Http請(qǐng)求傳json數(shù)據(jù)亂碼問題的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論