(多線程)leetcode1117. H2O 生成 認識Java中的PV原語

現在有兩種線程,氫 oxygen 和氧 hydrogen,你的目標是組織這兩種線程來產生水分子。

存在一個屏障(barrier)使得每個線程必須等候直到一個完整水分子能夠被產生出來。

氫和氧線程會被分別給予 releaseHydrogen 和 releaseOxygen 方法來允許它們突破屏障。

這些線程應該三三成組突破屏障并能立即組合產生一個水分子。

你必須保證產生一個水分子所需線程的結合必須發生在下一個水分子產生之前。

換句話說:

如果一個氧線程到達屏障時沒有氫線程到達,它必須等候直到兩個氫線程到達。
如果一個氫線程到達屏障時沒有其它線程到達,它必須等候直到一個氧線程和另一個氫線程到達。
書寫滿足這些限制條件的氫、氧線程同步代碼。

示例 1:

輸入: "HOH"
輸出: "HHO"
解釋: "HOH" 和 "OHH" 依然都是有效解。
示例 2:

輸入: "OOHHHH"
輸出: "HHOHHO"
解釋: "HOHHHO", "OHHHHO", "HHOHOH", "HOHHOH", "OHHHOH", "HHOOHH", "HOHOHH" 和 "OHHOHH" 依然都是有效解。
?

限制條件:

輸入字符串的總長將會是 3n, 1 ≤?n?≤ 50;
輸入字符串中的 “H” 總數將會是 2n;
輸入字符串中的 “O” 總數將會是 n。

思路:說白了就是控制個順序。互相pv一下。可以去找一下我寫的操作系統多線程控制。

class H2O {private Semaphore h = new Semaphore(2);private Semaphore o = new Semaphore(0);public H2O() {}public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {h.acquire();// releaseHydrogen.run() outputs "H". Do not change or remove this line.releaseHydrogen.run();o.release();}public void oxygen(Runnable releaseOxygen) throws InterruptedException {o.acquire(2);// releaseOxygen.run() outputs "O". Do not change or remove this line.releaseOxygen.run();h.release(2);}
}

Semaphore簡介


Semaphore,是JDK1.5的java.util.concurrent并發包中提供的一個并發工具類。

所謂Semaphore即 信號量 的意思。

這個叫法并不能很好地表示它的作用,更形象的說法應該是許可證管理器。

其作用在JDK注釋中是這樣描述的:

A counting semaphore.
Conceptually, a semaphore maintains a set of permits.
Each {@link #acquire} blocks if necessary until a permit is available, and then takes it.
Each {@link #release} adds a permit, potentially releasing a blocking acquirer.
However, no actual permit objects are used; the {@code Semaphore} just keeps a count of the number available and acts accordingly.

翻譯過來,就是:

Semaphore是一個計數信號量。
從概念上將,Semaphore包含一組許可證。
如果有需要的話,每個acquire()方法都會阻塞,直到獲取一個可用的許可證。
每個release()方法都會釋放持有許可證的線程,并且歸還Semaphore一個可用的許可證。
然而,實際上并沒有真實的許可證對象供線程使用,Semaphore只是對可用的數量進行管理維護。
2.Semaphore方法說明
Semaphore的方法如下:

——Semaphore(permits)

初始化許可證數量的構造函數

——Semaphore(permits,fair)

初始化許可證數量和是否公平模式的構造函數

——isFair()

是否公平模式FIFO

——availablePermits()

獲取當前可用的許可證數量

——acquire()

當前線程嘗試去阻塞的獲取1個許可證。

此過程是阻塞的,它會一直等待許可證,直到發生以下任意一件事:

當前線程獲取了1個可用的許可證,則會停止等待,繼續執行。
當前線程被中斷,則會拋出InterruptedException異常,并停止等待,繼續執行。
——acquire(permits)

當前線程嘗試去阻塞的獲取permits個許可證。

此過程是阻塞的,它會一直等待許可證,直到發生以下任意一件事:

當前線程獲取了n個可用的許可證,則會停止等待,繼續執行。
當前線程被中斷,則會拋出InterruptedException異常,并停止等待,繼續執行。
——acquierUninterruptibly()

當前線程嘗試去阻塞的獲取1個許可證(不可中斷的)。

此過程是阻塞的,它會一直等待許可證,直到發生以下任意一件事:

當前線程獲取了1個可用的許可證,則會停止等待,繼續執行。
——acquireUninterruptibly(permits)

當前線程嘗試去阻塞的獲取permits個許可證。

此過程是阻塞的,它會一直等待許可證,直到發生以下任意一件事:

當前線程獲取了n個可用的許可證,則會停止等待,繼續執行。
——tryAcquire()

當前線程嘗試去獲取1個許可證。

此過程是非阻塞的,它只是在方法調用時進行一次嘗試。

如果當前線程獲取了1個可用的許可證,則會停止等待,繼續執行,并返回true。

如果當前線程沒有獲得這個許可證,也會停止等待,繼續執行,并返回false。

——tryAcquire(permits)

當前線程嘗試去獲取permits個許可證。

此過程是非阻塞的,它只是在方法調用時進行一次嘗試。

如果當前線程獲取了permits個可用的許可證,則會停止等待,繼續執行,并返回true。

如果當前線程沒有獲得permits個許可證,也會停止等待,繼續執行,并返回false。

——tryAcquire(timeout,TimeUnit)

當前線程在限定時間內,阻塞的嘗試去獲取1個許可證。

此過程是阻塞的,它會一直等待許可證,直到發生以下任意一件事:

當前線程獲取了可用的許可證,則會停止等待,繼續執行,并返回true。
當前線程等待時間timeout超時,則會停止等待,繼續執行,并返回false。
當前線程在timeout時間內被中斷,則會拋出InterruptedException一次,并停止等待,繼續執行。
——tryAcquire(permits,timeout,TimeUnit)

當前線程在限定時間內,阻塞的嘗試去獲取permits個許可證。

此過程是阻塞的,它會一直等待許可證,直到發生以下任意一件事:

當前線程獲取了可用的permits個許可證,則會停止等待,繼續執行,并返回true。
當前線程等待時間timeout超時,則會停止等待,繼續執行,并返回false。
當前線程在timeout時間內被中斷,則會拋出InterruptedException一次,并停止等待,繼續執行。
——release()

當前線程釋放1個可用的許可證。

——release(permits)

當前線程釋放permits個可用的許可證。

——drainPermits()

當前線程獲得剩余的所有可用許可證。

——hasQueuedThreads()

判斷當前Semaphore對象上是否存在正在等待許可證的線程。

——getQueueLength()

獲取當前Semaphore對象上是正在等待許可證的線程數量。
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444148.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444148.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

首元節點

線性表的鏈式表示和實現: 1.區分一個概念:頭結點 頭指針 首元節點 首元節點:就是線性表(這里為什么說是線性表,而不說是鏈表呢?因為我們先來講清楚首元節點的概念,不涉及指針)當中第…

(多線程)leetcode1195. 交替打印字符串 最簡單解法一個變量搞定

編寫一個可以從 1 到 n 輸出代表這個數字的字符串的程序,但是: 如果這個數字可以被 3 整除,輸出 "fizz"。 如果這個數字可以被 5 整除,輸出 "buzz"。 如果這個數字可以同時被 3 和 5 整除,輸出 &…

MYSQ產品

前言:MySQL數據庫,隸屬于MySQLAB公司,總部位于瑞典,后被Oracle收購 MySQLAB公司是由monky及他的兩位好朋友創建的,先是被sun公司收購然后被偶爾甲骨文公司收購 MySQL的優點: 1.它的成本是比較低的&#xff…

處理百萬級以上的數據提高查詢速度的方法

1.應盡量避免在where子句中使用!或<>操作符&#xff0c;否則將引擎放棄使用索引而進行全表掃描。2.對查詢進行優化&#xff0c;應盡量避免全表掃描&#xff0c;首先應考慮在where及orderby涉及的列上建立索引。3.應盡量避免在where子句中對字段進行null值判斷&#xff0c…

leetcode三道shell題

給定一個文本文件 file.txt&#xff0c;請只打印這個文件中的第十行。 示例: 假設 file.txt 有如下內容&#xff1a; Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 你的腳本應當顯示第十行&#xff1a; Line 10 sed -n 10p file.txt 給定一個…

DateFormat(炸窩)

222&#xff1a;DateFormat方法的使用以及功能&#xff1a; java.text.DateFormat是日期或者時間格式化子類的抽象類&#xff0c;作用&#xff1a;可以幫我們完成日期和文本之間的轉換&#xff0c;也就是可以在Date對象與String對象之間進行來回轉換 格式化&#xff1a; 按照指…

劍指offer:3-7記錄

找出數組中重復的數字。 在一個長度為 n 的數組 nums 里的所有數字都在 0&#xff5e;n-1 的范圍內。數組中某些數字是重復的&#xff0c;但不知道有幾個數字重復了&#xff0c;也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。 示例 1&#xff1a; 輸入&#…

計算一個人出生了多少天(炸窩)

223&#xff1a; 小小練習&#xff1a; 請使用日期API來計算一個人出生了多少天&#xff1f; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class zixuejava { public static void main(Str…

劍指offer:8-11記錄

用兩個棧實現一個隊列。隊列的聲明如下&#xff0c;請實現它的兩個函數 appendTail 和 deleteHead &#xff0c;分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&#xff1a; 輸入&#xff1a; ["…

mysql命令

Mysql常見的命令總結&#xff1a; mysql服務的退出以及登陸 方式一&#xff1a;通過mysql自帶的客戶端&#xff0c;只限于root用戶 方式二&#xff1a;通過Windows自帶的客戶端&#xff0c; 登陸&#xff1a;mysql -uroot -p&#xff1b; 退出&#xff1a;exit或者是ctrlc&am…

leetcode343. 整數拆分

給定一個正整數 n&#xff0c;將其拆分為至少兩個正整數的和&#xff0c;并使這些整數的乘積最大化。 返回你可以獲得的最大乘積。 示例 1: 輸入: 2 輸出: 1 解釋: 2 1 1, 1 1 1。 示例 2: 輸入: 10 輸出: 36 解釋: 10 3 3 4, 3 3 4 36。 思路&#xff1a;動態規…

尚硅谷李老師Mysql基礎筆記

數據庫的相關概念 一&#xff1a;數據庫的好處 1.可以持久化數據到本地 2.結構化查詢 二&#xff1a;數據庫的常見概念 1.DB&#xff1a;數據庫&#xff0c;存儲數據的容器 2.DBMS:數據庫管理系統&#xff0c;又稱為數據庫軟件或數據庫產品&#xff0c;用于創建或者管理數據&…

劍指offer:12-17記錄

請設計一個函數&#xff0c;用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一格開始&#xff0c;每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格&#xff0c;那么該路徑不能再次進入該格子。例如&#xf…

劍指offer:18-21記錄

給定單向鏈表的頭指針和一個要刪除的節點的值&#xff0c;定義一個函數刪除該節點。 返回刪除后的鏈表的頭節點。 注意&#xff1a;此題對比原題有改動 示例 1: 輸入: head [4,5,1,9], val 5 輸出: [4,1,9] 解釋: 給定你鏈表中值為 5 的第二個節點&#xff0c;那么在調用…

尚硅谷李老師筆記2

一&#xff1a;MySQL的背景 前身是瑞典的一家公司&#xff0c;MySQLAB 08年被sun公司收購 09年sun公司被oracle公司收購 二&#xff1a;MySQL的優點 1.開源&#xff0c;免費&#xff0c;成本低 2.性能高&#xff0c;移植性好 3.體積小&#xff0c;便于安裝 三&#xff1a;MyS…

劍指offer:22-25記錄

輸入一個鏈表&#xff0c;輸出該鏈表中倒數第k個節點。為了符合大多數人的習慣&#xff0c;本題從1開始計數&#xff0c;即鏈表的尾節點是倒數第1個節點。例如&#xff0c;一個鏈表有6個節點&#xff0c;從頭節點開始&#xff0c;它們的值依次是1、2、3、4、5、6。這個鏈表的倒…

尚硅谷李老師筆記3DQL

一&#xff1a;語法 select 查詢列表 from 表名 二&#xff1a;特點 1.查詢列表可以是字段&#xff0c;常量&#xff0c;表達式&#xff0c;函數&#xff0c;也可以是多個的組合結果 2.查詢結果是一張虛擬表 三&#xff1a;示例 1.查詢單個字段 select 字段名 from 表名 2.查…

java 防止表單重復提交

防止表單重復提交&#xff0c;或者是防止按F5 刷新提交表單。 在WEB開發中是經常會碰到這樣的問題的。 目前主流的解決方法有以下三種&#xff1a; 1、采用腳本來解決 2、重定向到別的頁面 3、使用s:token 標簽 由于我是使用S2SH來開發的&#xff0c;所以就選擇了第三種方法。 …

貪吃蛇源代碼111

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <time.h> const int H 8; //地圖的高 const int L 16; //地圖的長 char GameMap[H][L]; //游戲地圖 int key; //按鍵保存 int sum 1, over 0; //蛇…

劍指offer:26-30記錄

輸入兩棵二叉樹A和B&#xff0c;判斷B是不是A的子結構。(約定空樹不是任意一個樹的子結構) B是A的子結構&#xff0c; 即 A中有出現和B相同的結構和節點值。 例如: 給定的樹 A: 3 / \ 4 5 / \ 1 2 給定的樹 B&#xff1a; 4 / 1 返回 true&#xff0c;因為…