創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
線程與線程間通信
一、基本概念以及線程與進程之間的區(qū)別聯(lián)系:
關(guān)于進程和線程,首先從定義上理解就有所不同
1、進程是什么?
是具有一定獨立功能的程序、它是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位,重點在系統(tǒng)調(diào)度和單獨的單位,也就是說進程是可以獨 立運行的一段程序。
2、線程又是什么?
線程進程的一個實體,是CPU調(diào)度和分派的基本單位,他是比進程更小的能獨立運行的基本單位,線程自己基本上不擁有系統(tǒng)資源。
在運行時,只是暫用一些計數(shù)器、寄存器和棧 。
他們之間的關(guān)系
1、一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程(通常說的主線程)。
2、資源分配給進程,同一進程的所有線程共享該進程的所有資源。
3、線程在執(zhí)行過程中,需要協(xié)作同步。不同進程的線程間要利用消息通信的辦法實現(xiàn)同步。
4、處理機分給線程,即真正在處理機上運行的是線程。
5、線程是指進程內(nèi)的一個執(zhí)行單元,也是進程內(nèi)的可調(diào)度實體。
從三個角度來剖析二者之間的區(qū)別
1、調(diào)度:線程作為調(diào)度和分配的基本單位,進程作為擁有資源的基本單位。
2、并發(fā)性:不僅進程之間可以并發(fā)執(zhí)行,同一個進程的多個線程之間也可以并發(fā)執(zhí)行。
3、擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統(tǒng)資源,但可以訪問隸屬于進程的資源。.
二、多線程間通信方式:
1、共享變量
2、wait/notify機制
3、Lock/Condition機制
4、管道
三、共享變量
線程間發(fā)送信號的一個簡單方式是在共享對象的變量里設(shè)置信號值。線程A在一個同步塊里設(shè)置boolean型成員變量hasDataToProcess為true,線程B也在同步塊里讀取hasDataToProcess這個成員變量。這個簡單的例子使用了一個持有信號的對象,并提供了set和check方法:
public class MySignal{ protected boolean hasDataToProcess = false; public synchronized boolean hasDataToProcess(){ return this.hasDataToProcess; } public synchronized void setHasDataToProcess(boolean hasData){ this.hasDataToProcess = hasData; } }
線程A和B必須獲得指向一個MySignal共享實例的引用,以便進行通信。如果它們持有的引用指向不同的MySingal實例,那么彼此將不能檢測到對方的信號。需要處理的數(shù)據(jù)可以存放在一個共享緩存區(qū)里,它和MySignal實例是分開存放的。
四、wait()/notify機制
為了實現(xiàn)線程通信,我們可以使用Object類提供的wait()、notify()、notifyAll()三個方法。調(diào)用wait()方法會釋放對該同步監(jiān)視器的鎖定。這三個方法必須由同步監(jiān)視器對象來調(diào)用,這可分成兩種情況:
•對于使用synchronized修飾的同步方法,因為該類的默認(rèn)實例是(this)就是同步監(jiān)視器,所以可以直接調(diào)用這三使用個方法。
•對于synchronized修飾的同步代碼塊,同步監(jiān)視器是synchronized括號里的對象,所以必須使用該對象調(diào)用這三個方法。
假設(shè)系統(tǒng)中有兩條線程,這兩條線程分別代表取錢者和存錢者。現(xiàn)在系統(tǒng)有一種特殊的要求,系統(tǒng)要求存款者和取錢者不斷的實現(xiàn)存款和取錢動作,而且要求每當(dāng)存款者將錢存入指定賬戶后,取錢者立即將錢取走.不允許存款者兩次存錢,也不允許取錢者兩次取錢。
我們通過設(shè)置一個旗標(biāo)來標(biāo)識賬戶中是否已有存款,有就為true,沒有就標(biāo)為false。具體代碼如下:
首先我們定義一個Account類,這個類中有取錢和存錢的兩個方法,由于這兩個方法可能需要并發(fā)的執(zhí)行取錢、存錢操作,所有將這兩個方法都修改為同步方法.(使用synchronized關(guān)鍵字)。
public class Account { private String accountNo; private double balance; //標(biāo)識賬戶中是否有存款的旗標(biāo) private boolean flag=false; public Account() { super(); } public Account(String accountNo, double balance) { super(); this.accountNo = accountNo; this.balance = balance; } public synchronized void draw (double drawAmount){ try { if(!flag){ this.wait(); }else { //取錢 System.out.println(Thread.currentThread().getName()+" 取錢:"+drawAmount); balance=balance-drawAmount; System.out.println("余額 : "+balance); //將標(biāo)識賬戶是否已有存款的標(biāo)志設(shè)為false flag=false; //喚醒其它線程 this.notifyAll(); } } catch (Exception e) { e.printStackTrace(); } } public synchronized void deposit(double depositAmount){ try { if(flag){ this.wait(); } else{ System.out.println(Thread.currentThread().getName()+"存錢"+depositAmount); balance=balance+depositAmount; System.out.println("賬戶余額為:"+balance); flag=true; //喚醒其它線程 this.notifyAll(); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
網(wǎng)站標(biāo)題:詳談java線程與線程、進程與進程間通信-創(chuàng)新互聯(lián)
分享URL:http://chinadenli.net/article10/ddgcgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站內(nèi)鏈、小程序開發(fā)、網(wǎng)站維護、靜態(tài)網(wǎng)站、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容