freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

java程序設(shè)計(jì)之網(wǎng)絡(luò)編程輸入輸出處理、線程ppt-資料下載頁

2024-10-16 23:40本頁面
  

【正文】 ? 首先我們來看一個(gè)例子 。 類 Acount代表一個(gè)銀行賬戶 。 其中變量 balance是該賬戶的余額 。 public class Acount{ double balance。 public Acount(double money){ balance = money。 (Totle Money: +balance)。 } } 下面我們定義一個(gè)線程 , 該線程的主要任務(wù)是從 Acount中取出一定數(shù)目的錢 。 public class AcountThread extends Thread { Acount acount。 int delay。 public AcountThread(Acount acount,int delay) { =acount。 = delay。 } public void run(){ if( = 100){ try{ sleep(delay)。 = 100。 (withdraw 100 successful!)。 }catch(InterruptedException e) { } } else (withdraw failed!)。 } public static void main(String[] args) { Acount acount = new Acount(100)。 AcountThread acountThread1 = new AcountThread(acount,1000)。 AcountThread acountThread2 = new AcountThread(acount,0)。 ()。 ()。 } } ? 該結(jié)果非常奇怪,因?yàn)楸M管賬面上只有100元,但是兩個(gè)取錢線程都取得了 100元錢,也就是總共得到了 200元錢。出錯(cuò)的原因在哪里呢? ? 由于線程 1在判斷滿足取錢的條件后,被線程 2打斷,還沒有來得及修改余額。因此線程 2也滿足取錢的條件,并完成了取錢動(dòng)作。從而使共享數(shù)據(jù) balance的完整性被破壞。 參見 運(yùn)行結(jié)果如下: Totle Money: withdraw 100 successful! withdraw 100 successful! 互斥對(duì)象 ? 上面的問題,并不是新問題,其實(shí)在并發(fā)程序設(shè)計(jì)中已經(jīng)被研究并得到了解決。我們首先回憶兩個(gè)概念。在并發(fā)程序設(shè)計(jì)中,對(duì)多線程共享的資源或數(shù)據(jù)成為臨界資源,而把每個(gè)線(進(jìn))程中訪問臨界資源的那一段代碼段成為臨界代碼段。通過為臨界代碼段設(shè)置信號(hào)燈,就可以保證資源的完整性,從而安全地訪問共享資源 互斥對(duì)象 為了實(shí)現(xiàn)這種機(jī)制 , Java語言提供以下兩方面的支持: 1 為每個(gè)對(duì)象設(shè)置了一個(gè) “ 互斥鎖 ” 標(biāo)記 。該標(biāo)記保證在每一個(gè)時(shí)刻 , 只能有一個(gè)線程擁有該互斥鎖 , 其它線程如果需要獲得該互斥鎖 , 必須等待當(dāng)前擁有該鎖的線程將其釋放 。 該對(duì)象成為互斥對(duì)象 。因此 , java中的每一個(gè)對(duì)象都是互斥對(duì)象 . 2 為了配合使用對(duì)象的互斥鎖 , Java語言提供了保留字 如下: synchronized(互斥對(duì)象 ){ 臨界代碼段 } 修改后的程序 class Semaphore{} public class AcountThread2 extends Thread { Acount acount。 int delay。 Semaphore semaphore。 public AcountThread2(Acount acount,int delay,Semaphore semaphore) { =acount。 = delay。 = semaphore。 } public void run(){ synchronized (semaphore) { if ( = 100) { try { sleep(delay)。 = 100。 (withdraw 100 successful!)。 } catch (InterruptedException e) { } } else (withdraw failed!)。 } } public static void main(String[] args) { Acount acount = new Acount(100)。 Semaphore semaphore = new Semaphore()。 AcountThread2 acountThread1 = new AcountThread2(acount,1000,semaphore)。 AcountThread2 acountThread2 = new AcountThread2(acount,0,semaphore)。 ()。 ()。 } } ? Synchronized的幾種使用方法: 1)前一例 2) 把帳戶對(duì)象本身作為信號(hào)燈 。 3) 把 synchronized放在取款方法的前面 線程同步 ? 在前面我們研究了共享資源的訪問問題 。 在實(shí)際應(yīng)用中 , 多個(gè)線程之間不僅需要互斥機(jī)制來保證對(duì)共享數(shù)據(jù)的完整性 , 而且有時(shí)需要多個(gè)線程之間互相協(xié)作 , 按照某種既定的步驟來共同完成任務(wù) 。 一個(gè)典型的應(yīng)用是稱之為生產(chǎn) 消費(fèi)者模型 。 該模型可抽象為如下圖 。 其約束條件為: 1) 生產(chǎn)者負(fù)責(zé)產(chǎn)品 , 并將其保存到倉(cāng)庫(kù)中; 2) 消費(fèi)者從倉(cāng)庫(kù)中取得產(chǎn)品 。 3) 由于庫(kù)房容量有限 , 因此只有當(dāng)庫(kù)房還有空間時(shí) , 生產(chǎn)者才可以將產(chǎn)品加入庫(kù)房;否則只能等待 。 ? 只有庫(kù)房中存在滿足數(shù)量的產(chǎn)品時(shí),消費(fèi)者才能取走產(chǎn)品,否則只能等待。 線程同步 ? 實(shí)際應(yīng)用中的許多例子都可以歸結(jié)為該模型 。 如在操作系統(tǒng)中的打印機(jī)調(diào)度問題 , 庫(kù)房的管理問題等 。 為了研究該問題 , 我們?nèi)匀灰郧懊娴拇婵钆c取款問題作為例子 , 假設(shè)存在一個(gè)賬戶對(duì)象 (倉(cāng)庫(kù) )及兩個(gè)線程:存款線程 (生產(chǎn)者 )和取款線程 (消費(fèi)者 ), 并對(duì)其進(jìn)行如下的限制; ? 1 只有當(dāng)賬戶上的余額 balance=0時(shí) , 存款線程才可以存進(jìn) 100元;否則只能等待; ? 2 只有當(dāng)賬戶上的余額 balance=100時(shí),取款線程才可以取走 100元;否則只能等待。 線程同步 ? wait()方法的語義是:當(dāng)一個(gè)線程執(zhí)行了該方法 , 則該線程進(jìn)入阻塞狀態(tài) , 同時(shí)讓出同步對(duì)象的互斥鎖 , 并自動(dòng)進(jìn)入互斥對(duì)象的等待隊(duì)列 。 ? notify()方法的語義是 : 當(dāng)一個(gè)線程執(zhí)行了該方法 , 則擁有該方法的互斥對(duì)象的等待隊(duì)列中的第一個(gè)線程被喚醒 , 同時(shí)自動(dòng)獲得該互斥對(duì)象的互斥鎖 , 并進(jìn)入就緒狀態(tài)等待調(diào)度 。 ? 利用這兩個(gè)方法 , 我們對(duì)上面的程序修改如下: 參見例子: 兩個(gè)線程之間的同步 兩個(gè)線程之間的同步(全部代碼) public class Acount4 { double balance。 public Acount4(){ balance = 0。 (Totle Money: +balance)。 } public synchronized void withdraw(double money){ if(balance == 0) try{ wait()。 }catch(InterruptedException e){ } balance = balance money。 (withdraw 100 success)。 notify()。 } ? public synchronized void deposite(double money){ if (balance != 0) try { wait()。 } catch (InterruptedException e) { } balance = balance + money。 (deposite 100 success)。 notify()。 } } public class AcountThread3 extends Thread { Acount2 acount。 public AcountThread3(Acount2 acount) { = acount。 } public void run(){ (100)。 } public static void main(String[] args) { Acount2 acount = new Acount2(100)。 AcountThread3 acountThread31 = new AcountThread3(acount)。 AcountThread3 acountThread32 = new AcountThread3(acount)。 ()。 ()。 } } 線程通訊 ? 線程之間的通訊問題是指線程之間相互傳遞信息 , 這些信息包括數(shù)據(jù) 、 控制指令等 。 我們前面舉例中數(shù)據(jù)共享也是線程的一種通信方式 。 此外 , java語言還提供了線程之間通過 管道 來進(jìn)行通信的方式 。 其結(jié)構(gòu)表示 。 管道通信具有如下特點(diǎn): ? l 管道是單向的 。 一個(gè)線程充當(dāng)發(fā)送者 ,另一個(gè)線程充當(dāng)接收者 。 如果需要建立雙向通信 , 可以通過建立多個(gè)管道解決 。 ? l 管道通信是面向連接的 。 因此在程序設(shè)計(jì)中 , 一方線程必須建立起對(duì)應(yīng)的端點(diǎn) ,由另一方線程來建立連接 。 ? l 管道中的信息是嚴(yán)格按照發(fā)送的順序進(jìn)行傳送的 。 因此接收受方收到的數(shù)據(jù)和發(fā)送方在順序上完全一致 。 ? 線程通訊參見 import .*。 class SenderThread extends Thread{ PipedWriter pipedWriter。 public SenderThread( ){ pipedWriter = new PipedWriter( )。 } public PipedWriter getPipedWriter( ){ return pipedWriter。 } public void run( ){ for (int i =0。 i5。i++){ try{ (i)。 }catch(IOException e){ } (Send: +i)。 } } } 線程死鎖 ? 線程死鎖是并發(fā)程序設(shè)計(jì)中可能遇到的問題之一 。 它是指程序運(yùn)行中 , 多個(gè)線程競(jìng)爭(zhēng)共享資源時(shí)可能出現(xiàn)的一種系統(tǒng)狀態(tài):線程 1擁有資源 1, 并等待資源 2,而線程 2擁有資源 2, 并等待資源 3,… ,以此類推 , 線程 n擁有資源 n1,并等待資源1。 在這種狀態(tài)下 , 各個(gè)線程互不相讓 ,永遠(yuǎn)進(jìn)入一種等待狀態(tài) 。 線程死鎖 ? 哲學(xué)家用餐問題 我們可以想象 , 如果每個(gè)哲學(xué)家都彬彬有禮 , 并且高談闊論 , 輪流吃飯 , 則這種融洽的氣氛可以長(zhǎng)久地保持下去 。 但是可能出現(xiàn)這樣一種情景:當(dāng)每個(gè)人都拿起自己左手邊的筷子 ,并同時(shí)去拿自己右手邊的筷子時(shí) , 會(huì)發(fā)生什么情況:五個(gè)人每人拿著一支筷子 , 盯著自己右手邊的那位哲學(xué)手里的一支筷子 , 處于僵持狀態(tài) 。 這就是發(fā)生了 “ 線程死鎖 ” 。 需要指出的事 , 線程死鎖并不是必然會(huì)發(fā)生 , 在某些情況下 , 可能會(huì)非常偶然 。 例程 1019模擬了哲學(xué)
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1