多執行緒模擬火車站售票

2021-09-29 01:56:03 字數 1455 閱讀 8384

生活中其實有很多多執行緒的例子,比如火車站售票就是乙個例子。我們先來分析一下,

(1)首先要有火車票的總數量,並且每賣出一張火車票,總量就減一

(2)當火車票的數量小於1的時候,就停止售票

(3)使用多執行緒模擬各個視窗進行售票

(4)當火車票售完後,火車站也同樣歡迎我們

下來,我們**來實現火車站售票例項

public class mythread implements runnable  catch (interruptedexception e) 

system.out.println(thread.currentthread().getname()+": "+tickets--);

}} }

}public class threaddemo }/*

視窗三: 5

視窗一: 4

視窗二: 3

視窗三: 2

視窗一: 1

視窗二: 0

視窗三: -1

*/

觀察輸出結果,居然出現了-1!這不是我們想要的結果,為什麼呢?因為在run()方法中,我們使用sleep()方法讓執行緒睡了一會兒,就出現了-1這個結果,那為什麼呢?

我們可以這樣理解,假設此時就只剩下一張票沒有賣出去了,

這時t1進來了,一看有票準備開始售票,但是他突然肚子疼就去上廁所了。

這個時候t2進來了,一看有票準備開始售票,但是他突然也肚子疼就去上廁所了。

其實這個時候相當於t1、t2已經進入if這個判斷語句了。

過了一會兒t1上完廁所回來了,開始售票,這個時候所有的票已經賣完了,tickets=0。

這個時候t2也上完廁所回來了,但是他不知道票賣完了(因為他早都進入if語句裡面了),然後開始售票,這個時候tickets=-1就出現了我們上面的結果了。

所以為了解決這個問題,我們引入了同步機制

synchronized: 關鍵字,同步(鎖),可以修飾**塊和方法,一旦被某個執行緒訪問,則直接鎖住,其它執行緒不能訪問

同步**塊

synchronized(鎖)
注意:鎖物件需要被所有執行緒共享

接著上面的例子,我們給其上鎖

public class mythread implements runnable  catch (interruptedexception e) 

system.out.println(thread.currentthread().getname()+": "+tickets--);

}} }

} }/*視窗二: 5

視窗二: 4

視窗一: 3

視窗一: 2

視窗三: 1

*/

我們發現這個時候的輸出結果是正確的。但是我們在執行的過程中發現執行速度沒有之前快,這是因為加了鎖以後每次都要進行開鎖、關鎖,所以執行速度變慢了。

Python多執行緒(模擬火車站售票)

python的標準庫提供了兩個模組 thread和threading,thread是低階模組,threading是高階模組,對thread進行了封裝。我們使用threading這個高階模組,模擬火車站賣票,如果不加鎖,賣出同一張票 import threading from time import ...

Python多執行緒實現模擬火車站售票

python的標準庫提供了兩個模組 thread和threading,thread是低階模組,threading是高階模組,對thread進行了封裝。我們使用threading這個高階模組,模擬火車站賣票,如果不加鎖,賣出同一張票 import threading from time import ...

火車站 題解

題目傳送門 有乙個奇奇怪怪的火車站,奇奇怪怪的站長jtz想要解決乙個奇奇怪怪的問題。現在有 n 列火車要進出站,對於同一列車進站和出站有且只有一次鳴笛,笛聲有 1 m 種音調,要求相鄰的兩次鳴笛之間音調的差的絕對值不能小於 k 不鳴笛笛聲音調看作 1e100 不然耳朵不好的車站管理員xyh分不清楚是...