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

淺談Java多線程的優(yōu)點(diǎn)及代碼示例

 更新時(shí)間:2017年11月02日 16:43:25   作者:Jakob Jenkov  
這篇文章主要介紹了淺談Java多線程的優(yōu)點(diǎn)及代碼示例,還是比較不錯(cuò)的,這里分享給大家,需要的朋友可以參考。

盡管面臨很多挑戰(zhàn),多線程有一些優(yōu)點(diǎn)使得它一直被使用。這些優(yōu)點(diǎn)是:

資源利用率更好
程序設(shè)計(jì)在某些情況下更簡(jiǎn)單
程序響應(yīng)更快
資源利用率更好

想象一下,一個(gè)應(yīng)用程序需要從本地文件系統(tǒng)中讀取和處理文件的情景。比方說(shuō),從磁盤讀取一個(gè)文件需要5秒,處理一個(gè)文件需要2秒。處理兩個(gè)文件則需要:

5秒讀取文件A
2秒處理文件A
5秒讀取文件B
2秒處理文件B
---------------------
總共需要14秒

從磁盤中讀取文件的時(shí)候,大部分的CPU時(shí)間用于等待磁盤去讀取數(shù)據(jù)。在這段時(shí)間里,CPU非常的空閑。它可以做一些別的事情。通過(guò)改變操作的順序,就能夠更好的使用CPU資源??聪旅娴捻樞颍?/p>

5秒讀取文件A
5秒讀取文件B + 2秒處理文件A
2秒處理文件B
---------------------
總共需要12秒

CPU等待第一個(gè)文件被讀取完。然后開(kāi)始讀取第二個(gè)文件。當(dāng)?shù)诙募诒蛔x取的時(shí)候,CPU會(huì)去處理第一個(gè)文件。記住,在等待磁盤讀取文件的時(shí)候,CPU大部分時(shí)間是空閑的。

總的說(shuō)來(lái),CPU能夠在等待IO的時(shí)候做一些其他的事情。這個(gè)不一定就是磁盤IO。它也可以是網(wǎng)絡(luò)的IO,或者用戶輸入。通常情況下,網(wǎng)絡(luò)和磁盤的IO比CPU和內(nèi)存的IO慢的多。

程序設(shè)計(jì)更簡(jiǎn)單

在單線程應(yīng)用程序中,如果你想編寫程序手動(dòng)處理上面所提到的讀取和處理的順序,你必須記錄每個(gè)文件讀取和處理的狀態(tài)。相反,你可以啟動(dòng)兩個(gè)線程,每個(gè)線程處理一個(gè)文件的讀取和操作。線程會(huì)在等待磁盤讀取文件的過(guò)程中被阻塞。在等待的時(shí)候,其他的線程能夠使用CPU去處理已經(jīng)讀取完的文件。其結(jié)果就是,磁盤總是在繁忙地讀取不同的文件到內(nèi)存中。這會(huì)帶來(lái)磁盤和CPU利用率的提升。而且每個(gè)線程只需要記錄一個(gè)文件,因此這種方式也很容易編程實(shí)現(xiàn)。

程序響應(yīng)更快

將一個(gè)單線程應(yīng)用程序變成多線程應(yīng)用程序的另一個(gè)常見(jiàn)的目的是實(shí)現(xiàn)一個(gè)響應(yīng)更快的應(yīng)用程序。設(shè)想一個(gè)服務(wù)器應(yīng)用,它在某一個(gè)端口監(jiān)聽(tīng)進(jìn)來(lái)的請(qǐng)求。當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),它去處理這個(gè)請(qǐng)求,然后再返回去監(jiān)聽(tīng)。

服務(wù)器的流程如下所述:

while(server is active){
  listen for request
  process request
}

如果一個(gè)請(qǐng)求需要占用大量的時(shí)間來(lái)處理,在這段時(shí)間內(nèi)新的客戶端就無(wú)法發(fā)送請(qǐng)求給服務(wù)端。只有服務(wù)器在監(jiān)聽(tīng)的時(shí)候,請(qǐng)求才能被接收。另一種設(shè)計(jì)是,監(jiān)聽(tīng)線程把請(qǐng)求傳遞給工作者線程(worker thread),然后立刻返回去監(jiān)聽(tīng)。而工作者線程則能夠處理這個(gè)請(qǐng)求并發(fā)送一個(gè)回復(fù)給客戶端。這種設(shè)計(jì)如下所述:

while(server is active){
  listen for request
  hand request to worker thread
}

這種方式,服務(wù)端線程迅速地返回去監(jiān)聽(tīng)。因此,更多的客戶端能夠發(fā)送請(qǐng)求給服務(wù)端。這個(gè)服務(wù)也變得響應(yīng)更快。
桌面應(yīng)用也是同樣如此。如果你點(diǎn)擊一個(gè)按鈕開(kāi)始運(yùn)行一個(gè)耗時(shí)的任務(wù),這個(gè)線程既要執(zhí)行任務(wù)又要更新窗口和按鈕,那么在任務(wù)執(zhí)行的過(guò)程中,這個(gè)應(yīng)用程序看起來(lái)好像沒(méi)有反應(yīng)一樣。相反,任務(wù)可以傳遞給工作者線程(word thread)。當(dāng)工作者線程在繁忙地處理任務(wù)的時(shí)候,窗口線程可以自由地響應(yīng)其他用戶的請(qǐng)求。當(dāng)工作者線程完成任務(wù)的時(shí)候,它發(fā)送信號(hào)給窗口線程。窗口線程便可以更新應(yīng)用程序窗口,并顯示任務(wù)的結(jié)果。對(duì)用戶而言,這種具有工作者線程設(shè)計(jì)的程序顯得響應(yīng)速度更快。

下面是借鑒別人的一個(gè)Java多線程的例子,感謝。

問(wèn)題:三個(gè)售票窗口同時(shí)出售20張票;

程序分析:

1.票數(shù)要使用同一個(gè)靜態(tài)值
2.為保證不會(huì)出現(xiàn)賣出同一個(gè)票數(shù),要java多線程同步鎖。

設(shè)計(jì)思路:1.創(chuàng)建一個(gè)站臺(tái)類Station,繼承Thread,重寫run方法,在run方法里面執(zhí)行售票操作!售票要使用同步鎖:即有一個(gè)站臺(tái)賣這張票時(shí),其他站臺(tái)要等這張票賣完!

創(chuàng)建主方法調(diào)用類

(一)創(chuàng)建一個(gè)站臺(tái)類,繼承Thread

(原文有一點(diǎn)點(diǎn)小錯(cuò)誤,小編已經(jīng)更正,大家請(qǐng)放心測(cè)試使用)

package com.xykj.threadStation;
public class Station extends Thread {
	// 通過(guò)構(gòu)造方法給線程名字賦值
	public Station(String name) {
		super(name);
		// 給線程名字賦值
	}
	// 為了保持票數(shù)的一致,票數(shù)要靜態(tài)
	static int tick = 20;
	// 創(chuàng)建一個(gè)靜態(tài)鑰匙
	static Object ob = "aa";
	//值是任意的
	// 重寫run方法,實(shí)現(xiàn)買票操作
	@Override
	public void run() {
		while (tick > 0) {
			synchronized (ob) {
				// 這個(gè)很重要,必須使用一個(gè)鎖,
				// 進(jìn)去的人會(huì)把鑰匙拿在手上,出來(lái)后才把鑰匙拿讓出來(lái)
				if (tick > 0) {
					System.out.println(getName() + "賣出了第" + tick + "張票");
					tick--;
				} else {
					System.out.println("票賣完了");
				}
			}
			try {
				sleep(1000);
				//休息一秒
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

(二)創(chuàng)建主方法調(diào)用類

package com.xykj.threadStation;
public class MainClass {
	/**
* java多線程同步鎖的使用
* 示例:三個(gè)售票窗口同時(shí)出售10張票
* */
	public static void main(String[] args) {
		//實(shí)例化站臺(tái)對(duì)象,并為每一個(gè)站臺(tái)取名字
		Station station1=new Station("窗口1");
		Station station2=new Station("窗口2");
		Station station3=new Station("窗口3");
		// 讓每一個(gè)站臺(tái)對(duì)象各自開(kāi)始工作
		station1.start();
		station2.start();
		station3.start();
	}
}

運(yùn)行結(jié)果:

窗口1賣出了第20張票
窗口2賣出了第19張票
窗口3賣出了第18張票
窗口1賣出了第17張票
窗口2賣出了第16張票
窗口3賣出了第15張票
窗口3賣出了第14張票
窗口2賣出了第13張票
窗口1賣出了第12張票
窗口3賣出了第11張票
窗口2賣出了第10張票
窗口1賣出了第9張票
窗口1賣出了第8張票
窗口2賣出了第7張票
窗口3賣出了第6張票
窗口1賣出了第5張票
窗口3賣出了第4張票
窗口2賣出了第3張票
窗口3賣出了第2張票
窗口2賣出了第1張票
票賣完了

總結(jié)

以上就是本文關(guān)于淺談Java多線程的優(yōu)點(diǎn)及代碼示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱:Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解Java編程之多線程死鎖與線程間通信簡(jiǎn)單實(shí)現(xiàn)代碼、Java多線程編程小實(shí)例模擬停車場(chǎng)系統(tǒng)等,有什么問(wèn)題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • Java通過(guò)調(diào)用C/C++實(shí)現(xiàn)的DLL動(dòng)態(tài)庫(kù)——JNI的方法

    Java通過(guò)調(diào)用C/C++實(shí)現(xiàn)的DLL動(dòng)態(tài)庫(kù)——JNI的方法

    這篇文章主要介紹了Java通過(guò)調(diào)用C/C++實(shí)現(xiàn)的DLL動(dòng)態(tài)庫(kù)——JNI的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 簡(jiǎn)單談?wù)凾hreadPoolExecutor線程池之submit方法

    簡(jiǎn)單談?wù)凾hreadPoolExecutor線程池之submit方法

    下面小編就為大家?guī)?lái)一篇簡(jiǎn)單談?wù)凾hreadPoolExecutor線程池之submit方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java中StringBuilder類的介紹與常用方法

    Java中StringBuilder類的介紹與常用方法

    StringBuilder是一個(gè)可變的字符串的操作類,我們可以把它看成是一個(gè)對(duì)象容器,下面這篇文章主要給大家介紹了關(guān)于Java中StringBuilder類的介紹與常用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Java環(huán)境配置原理全面解析

    Java環(huán)境配置原理全面解析

    下面小編就為大家?guī)?lái)一篇Java環(huán)境配置原理全面解析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • Myeclipse鏈接Oracle等數(shù)據(jù)庫(kù)時(shí)lo exception: The Network Adapter could not establish the connection

    Myeclipse鏈接Oracle等數(shù)據(jù)庫(kù)時(shí)lo exception: The Network Adapter coul

    今天小編就為大家分享一篇關(guān)于Myeclipse鏈接Oracle等數(shù)據(jù)庫(kù)時(shí)lo exception: The Network Adapter could not establish the connection,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Spring @Import注解的使用

    Spring @Import注解的使用

    @Import注解算是SpringBoot自動(dòng)配置原理中一個(gè)很重要的注解,本文介紹了該注解的源碼分析及使用方法,感興趣的朋友可以了解下
    2021-05-05
  • SpringBoot集成Druid連接池進(jìn)行SQL監(jiān)控的問(wèn)題解析

    SpringBoot集成Druid連接池進(jìn)行SQL監(jiān)控的問(wèn)題解析

    這篇文章主要介紹了SpringBoot集成Druid連接池進(jìn)行SQL監(jiān)控的問(wèn)題解析,在SpringBoot工程中引入Druid連接池非常簡(jiǎn)單,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • springboot?security驗(yàn)證碼的登錄實(shí)例

    springboot?security驗(yàn)證碼的登錄實(shí)例

    這篇文章主要介紹了springboot?security驗(yàn)證碼的登錄實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java利用delayedQueue實(shí)現(xiàn)本地的延遲隊(duì)列

    java利用delayedQueue實(shí)現(xiàn)本地的延遲隊(duì)列

    這篇文章主要給大家介紹了java利用delayedQueue實(shí)現(xiàn)本地的延遲隊(duì)列的相關(guān)資料,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-04-04
  • 使用Java8實(shí)現(xiàn)觀察者模式的方法(上)

    使用Java8實(shí)現(xiàn)觀察者模式的方法(上)

    本文給大家介紹使用java8實(shí)現(xiàn)觀察者模式的方法,涉及到j(luò)ava8觀察者模式相關(guān)知識(shí),對(duì)此感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02

最新評(píng)論

万年县| 桑植县| 睢宁县| 寻乌县| 南皮县| 芒康县| 崇阳县| 桑植县| 大港区| 莆田市| 温泉县| 化州市| 云和县| 通山县| 商洛市| 周至县| 聂拉木县| 开远市| 南宫市| 宝山区| 贵溪市| 绵竹市| 中卫市| 获嘉县| 昌平区| 环江| 从化市| 荃湾区| 浑源县| 伊春市| 迁西县| 塔城市| 射洪县| 丽江市| 西华县| 平果县| 西昌市| 合山市| 瑞金市| 元氏县| 布拖县|