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

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

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

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

在欒城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需求定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站制作,欒城網(wǎng)站建設(shè)費用合理。

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

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

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

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

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

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

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

程序設(shè)計更簡單

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

程序響應(yīng)更快

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

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

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

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

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

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

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

問題:三個售票窗口同時出售20張票;

程序分析:

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

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

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

(一)創(chuàng)建一個站臺類,繼承Thread

(原文有一點點小錯誤,小編已經(jīng)更正,大家請放心測試使用)

package com.xykj.threadStation;
public class Station extends Thread {
	// 通過構(gòu)造方法給線程名字賦值
	public Station(String name) {
		super(name);
		// 給線程名字賦值
	}
	// 為了保持票數(shù)的一致,票數(shù)要靜態(tài)
	static int tick = 20;
	// 創(chuàng)建一個靜態(tài)鑰匙
	static Object ob = "aa";
	//值是任意的
	// 重寫run方法,實現(xiàn)買票操作
	@Override
	public void run() {
		while (tick > 0) {
			synchronized (ob) {
				// 這個很重要,必須使用一個鎖,
				// 進去的人會把鑰匙拿在手上,出來后才把鑰匙拿讓出來
				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多線程同步鎖的使用
* 示例:三個售票窗口同時出售10張票
* */
	public static void main(String[] args) {
		//實例化站臺對象,并為每一個站臺取名字
		Station station1=new Station("窗口1");
		Station station2=new Station("窗口2");
		Station station3=new Station("窗口3");
		// 讓每一個站臺對象各自開始工作
		station1.start();
		station2.start();
		station3.start();
	}
}

運行結(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)點及代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱:Java多線程之線程通信生產(chǎn)者消費者模式及等待喚醒機制代碼詳解、Java編程之多線程死鎖與線程間通信簡單實現(xiàn)代碼、Java多線程編程小實例模擬停車場系統(tǒng)等,有什么問題可以隨時留言,小編會及時回復(fù)大家的。感謝朋友們對本站的支持!


當(dāng)前標(biāo)題:淺談Java多線程的優(yōu)點及代碼示例
網(wǎng)站路徑:http://weahome.cn/article/gcicsd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部