java基礎總結(三十二)--java多執行緒程式設計例項
來自:https://blog.csdn.net/qq_34996727/article/details/80416277或者https://www.cnblogs.com/pureEve/p/6524366.html
一.相關知識:
Java多執行緒程式設計到的知識:
(一)對同一個數量進行操作
(二)對同一個物件進行操作
(三)回撥方法使用
(四)執行緒同步,死鎖問題
(五)執行緒通訊
等等
二.示例一:三個售票視窗同時出售20張票;
程式分析:1.票數要使用同一個靜態值
2.為保證不會出現賣出同一個票數,要java多執行緒同步鎖。
設計思路:1.建立一個站臺類Station,繼承Thread,重寫run方法,在run方法裡面執行售票操作!售票要使用同步鎖:即有一個站臺賣這張票時,其他站臺要等這張票賣完!
2.建立主方法呼叫類
(一)建立一個站臺類,繼承Thread
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
(二)建立主方法呼叫類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
程式執行結果:
可以看到票數是不會有錯的!
三.示例二:兩個人AB通過一個賬戶A在櫃檯取錢和B在ATM機取錢!
程式分析:錢的數量要設定成一個靜態的變數。兩個人要取的同一個物件值
(一)建立一個Bank類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
(二)建立一個PersonA類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
(三)建立一個PersonB類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
(四)建立主方法的呼叫類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
執行結果:
可以看到取完就停止運行了。
四.示例三:龜兔賽跑問題
龜兔賽跑:20米 //只要為了看到效果,所有距離縮短了
要求:
1.兔子每秒0.5米的速度,每跑2米休息10秒,
2.烏龜每秒跑0.1米,不休息
3.其中一個跑到終點後另一個不跑了!
程式設計思路:
1.建立一個Animal動物類,繼承Thread,編寫一個running抽象方法,重寫run方法,把running方法在run方法裡面呼叫。
2.建立Rabbit兔子類和Tortoise烏龜類,繼承動物類
3.兩個子類重寫running方法
4.本題的第3個要求涉及到執行緒回撥。需要在動物類建立一個回撥介面,建立一個回撥物件
(一)建立Animal動物類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
(二)建立Rabbit兔子類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
(三)建立Tortoise烏龜類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
(四)建立一個讓動物執行緒停止的類,這裡要實現回撥介面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
(五)建立一個主方法呼叫類,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
執行結果:
可以看到結果兔子贏了。
一般來說兔子獲得了勝利是在最後輸出的,
但是,由於執行緒一直在執行所以會出現:
“兔子跑了0.5米,距離終點還有0米”還沒來得及輸出完,
而“兔子獲得了勝利”已經輸出完畢了。
五.例項四:
在一個KFC內,服務員負責生產食物,消費者負責消費食物;
當生產到一定數量可以休息一下,直到消費完食物,再馬上生產,一直迴圈
程式涉及到的內容:
1.這設計到java模式思想:生產者消費者模式
2.要保證操作物件的統一性,即消費者和服務者都是跟同一個KFC發生關係的,KFC只能new一次
3.this.notifyAll();和 this.wait();一個是所有喚醒的意思,一個是讓自己等待的意思;
比如本題中,生產者生產完畢後,先所有喚醒(包括消費者和生產者),再讓所有自己(生產者)等待
這時,消費者開始消費,直到食材不夠,先所有喚醒(包括消費者和生產者),再讓所有自己(消費者)等待
一直執行上面的操作的迴圈
4.生產者和消費者都要繼承Thread,才能實現多執行緒的啟動
程式設計的步驟思路:
1.建立一個食物類Food,有存放/獲取食物的名稱的方法
2.建立一個KFC類,有生產食物和消費食物的方法
3.建立一個客戶類Customer,繼承Thread,重寫run方法,在run方法裡面進行消費食物操作
4.建立一個服務員類Waiter,繼承Thread,重寫run方法,在run方法裡面進行生產食物的操作
5.建立主方法的呼叫類
(一)建立一個食物類Food
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
(二)建立一個KFC類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
|
(三)建立一個客戶類Customer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
(四)建立一個服務員類Waiter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
(五)建立主方法的呼叫類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
六.示例五:設計四個執行緒物件對同一個資料進行操作,
兩個執行緒執行減操作,兩個執行緒執行加操作。
程式分析:1.建立一個ThreadAddSub類繼承Thread,重寫run方法
2.在run方法裡面實現加和減的操作,每次操作後睡眠1秒
3.建立主方法呼叫類
(一)建立一個ThreadAddSub類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
(二)建立主方法呼叫類
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
執行緒示例總結:
程式碼塊鎖是一個防止資料發生錯誤的一個重要手段。
物件的統一性是非常重要的,這要想到物件的傳入問題,
要操作的物件只能new一次,其他的操作都是對這個傳入的物件進行的,
才能保證資料一致性,完整性和正確性。
練習題目:
1. (多執行緒)程式碼實現火車站4個賣票視窗同時買票的場景,輸出示例:
視窗1賣票
視窗2賣票
視窗1賣票
...
2. (執行緒同步)程式碼實現火車站4個視窗同時賣100張票的程式碼邏輯,同一個視窗不能賣同一
張張票。
3. (執行緒通訊)小明打算去提款機上取錢,發現卡上沒錢,這時候他告知媽媽去存錢,媽媽
存了錢了,告知小明存好了可以取錢了。(PS:小明分多次取錢,每次取100,當發現錢不夠
100,就等待媽媽存錢,小明他媽每次存2000,當發現錢小於100就存錢,就存錢,並且
通知小明去取錢,當大於100就等待小明錢不夠是再存)
4. (執行緒同步)設計四個執行緒物件對同一個資料進行操作,兩個執行緒執行減操作,兩個執行緒執行
加操作。
5. (執行緒通訊)製作兩個執行緒物件,要求用同步塊的方式使第一個執行緒執行2次,然後將自己
阻塞起來,喚醒第二個執行緒,第二個執行緒再執行2次,然後將自己阻塞起來,喚醒第一個線
程……兩個執行緒交替執行。
6. (執行緒同步)設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1。
7. (執行緒通訊)子執行緒迴圈10次,接著主執行緒迴圈100,接著又回到子執行緒迴圈10次,接著
再回到主執行緒又迴圈100,如此迴圈50次。