生活中其實有很多多執行緒的例子,比如火車站售票就是乙個例子。我們先來分析一下,
(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分不清楚是...