多執行緒系列1 經典賣票

2021-09-25 20:37:43 字數 2237 閱讀 4726

1.賣票的方法

class

ticketrest

//////

未加鎖

/// ///

public

void sellticketnolock(int

num)

|售票員:售出第號車票,剩餘張");

ticket++;

task.delay(

200);}}

//////

加鎖

/// ///

public

void sellticketaddlock(int

num)

|售票員:售出第號車票,剩餘張");

ticket++;

task.delay(

200);}}

}

view code

2.使用thred的方式呼叫賣票方法

未加鎖的情況 (呼叫方法 sellticketnolock)會出現一張票多次賣出的情況和餘票不符合的情況。

3.使用task的方式呼叫賣票方法

閉包的陷阱 :

for (int i = 0; i < windowcount; i++)

));} 

最後的i值都是5  而不是原來 的i值啦。

解決方法 使用臨時變數,改為:

加鎖後(sellticketaddlock) 車票沒有重複 餘票也沒有出錯。

完整的**:

class

program

private

static

int ticketcount = 100;//

共20張票

private

static

int windowcount = 5;//

共5個視窗同時售票

//////

//演示多執行緒賣票案例-thread方式

/// static

void

sellthread()

);thread.start();}}

catch

(exception ex)

|||");}}

//////

演示多執行緒賣票案例-task方式

/// static

void

selltaskdemo()

));}

task.waitall(tasklst.toarray());

stopwatch2.stop();

console.writeline($

"使用多執行緒方式:**段執行時間(毫秒)");

}catch

(exception ex)

|||");}}

}class

ticketrest

//////

未加鎖

/// ///

public

void sellticketnolock(int

num)

|售票員:售出第號車票,剩餘張");

ticket++;

task.delay(

200);}}

//////

加鎖

/// ///

public

void sellticketaddlock(int

num)

|售票員:售出第號車票,剩餘張");

ticket++;

thread.sleep(100); //

模擬耗時操作

} }}}

view code

logge***ctory.instance.logger_error(ex); 這是輸出異常,可以使用console.writeline替代。

多執行緒經典問題 賣票問題

package com.llb.賣票.my 需求 某電影院目前正在上映國產大片,共有100張票,而它有3個視窗賣票,請設計乙個程式模擬該電影院賣票 思路 定義乙個類ticket實現runnable介面,裡面定義乙個成員變數 private int ticketcount 100 在ticket類中重...

多執行緒賣票

前置條件 設定總票數 比如20張 開啟多個售票視窗同時進行火車票的售賣 這裡多個視窗代表 多執行緒.代表啟動了多少個執行緒物件 怎麼賣票 借助迴圈 重複賣票動作 使用 while死迴圈 每賣出1張 總票數 操作 什麼時候退出迴圈?發現賣完了,退出迴圈 開啟執行緒 執行 run方法內部邏輯 單執行緒賣...

賣票 多執行緒模擬賣票系統

網上搶票,方便又高效,很舒服。應用多執行緒的同步執行可以模擬很多人搶票,而且不會發生衝突。下面,我們就來利用多執行緒來模擬一把。include include include int tickets 100 定義票數為全域性變數,所以執行緒都可訪問 pthread mutex t mutex 定義互...