真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java中常用的并發(fā)工具有哪些

這篇文章主要講解了“java中常用的并發(fā)工具有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“java中常用的并發(fā)工具有哪些”吧!

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)德令哈,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

1)閉鎖CountDownLatch

功能:讓一個主線程等待一組工作線程執(zhí)行完畢之后,才繼續(xù)執(zhí)行主線程,與join()方法的功能類似。

原理:
	1)CountDownLatch是通過一個計數(shù)器來實現(xiàn)的,計數(shù)器的初始值為需要等待線程的數(shù)量。
	2)當(dāng)一個線程完成了自己的任務(wù)后,計數(shù)器的值就會減1。
	3)當(dāng)計數(shù)器值為0時,說明所有的線程都執(zhí)行完了,此時,在閉鎖上等待的線程就可以恢復(fù)執(zhí)行任務(wù)。

注意:
	1)countDown()可以在每個線程中調(diào)用一次,也可以在一個線程中調(diào)用多次。
	2)計數(shù)器必須大于等于0,計數(shù)器為0時,調(diào)用await方法時不會阻塞當(dāng)前線程。

2)屏障(柵欄)CyclicBarrier

功能:讓一組線程到達(dá)一個屏障時被阻塞,直到最后一個線程到達(dá)屏障時,屏障才會開門(trip),所有被屏障攔截的線程才會繼續(xù)運(yùn)行。

CyclicBarrier和CountDownLatch的區(qū)別:

	1)CountDownLatch的計數(shù)器只能使用一次,而CyclicBarrier的計數(shù)器可以使用reset()方法重置。
	2)到達(dá)某個點后,使用CountDownLatch的線程繼續(xù)運(yùn)行,使用CyclicBarrier的線程停止運(yùn)行:
		使用CountDownLatch的線程運(yùn)行到某個點之后,調(diào)用 countDown() 方法將計數(shù)器的值減1,之后線程繼續(xù)執(zhí)行。
		使用CyclicBarrier 的線程運(yùn)行到某個點之后,調(diào)用 await()	   方法使該線程停止運(yùn)行,直到所有的線程都到達(dá)了這個點(調(diào)用await方法),(所有的)線程才可以繼續(xù)運(yùn)行。

3)信號量Semaphore

功能:控制并發(fā)的線程數(shù)。

原理:
	1)線程通過acquire()方法獲取許可證。
	2)線程通過release()方法歸還許可證。

說明:使用tryAcquire()方法可以立即得到執(zhí)行的結(jié)果:嘗試獲取一個許可證,若獲取成功,則立即返回true,若獲取失敗,則立即返回false。
	
應(yīng)用:流量控制,例如數(shù)據(jù)庫連接數(shù)的控制等。

4)交換者Exchanger

功能:兩個線程間數(shù)據(jù)的交換。

原理:
	1)線程A調(diào)用public V exchange(V dataA)方法,線程A到達(dá)同步點,并且在線程B到達(dá)同步點前一直等待。
	2)線程B調(diào)用public V exchange(V dataB)方法,線程B到達(dá)同步點。
	3)線程A與線程B都達(dá)到同步點時,線程將自己的數(shù)據(jù)傳遞給對方,兩個線程完成了數(shù)據(jù)的交換了。
	
 舉例:
	public class ExchangerTest {
		public static void main(String[] args) {
			
			final Exchanger exchanger = new Exchanger();
			
			ExecutorService service = Executors.newFixedThreadPool(2);

			service.execute(new Runnable() {
				public void run() {
					try {
						String originalData = "dataA";
						Thread.sleep(2000);
						System.out.println("線程" + Thread.currentThread().getName() + "正在把數(shù)據(jù)[" + originalData + "]傳遞出去..." + "	time:" + System.currentTimeMillis());
						String exchangedData = exchanger.exchange(originalData);
						System.out.println("線程" + Thread.currentThread().getName() + "獲取到另一線程的數(shù)據(jù)[" + exchangedData + "]" + "	time:" + System.currentTimeMillis());
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});

			service.execute(new Runnable() {
				public void run() {
					try {
						String originalData = "dataB";
						Thread.sleep(6000);
						System.out.println("線程" + Thread.currentThread().getName() + "正在把數(shù)據(jù)[" + originalData + "]傳遞出去..." + "	time:" + System.currentTimeMillis());
						String exchangedData = exchanger.exchange(originalData);
						System.out.println("線程" + Thread.currentThread().getName() + "獲取到另一線程的數(shù)據(jù)[" + exchangedData + "]" + "	time:" + System.currentTimeMillis());
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
		}
	}
	
	結(jié)果:
		線程pool-1-thread-1正在把數(shù)據(jù)[dataA]傳遞出去...	time:1506414528645
		線程pool-1-thread-2正在把數(shù)據(jù)[dataB]傳遞出去...	time:1506414532645
		線程pool-1-thread-2獲取到另一線程的數(shù)據(jù)[dataA]	time:1506414532645
		線程pool-1-thread-1獲取到另一線程的數(shù)據(jù)[dataB]	time:1506414532645

感謝各位的閱讀,以上就是“java中常用的并發(fā)工具有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對java中常用的并發(fā)工具有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!


當(dāng)前名稱:java中常用的并發(fā)工具有哪些
URL鏈接:http://weahome.cn/article/ggcpdi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部