亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

用互斥與同步的知識寫售票系統

我在run()方法里運用了互斥與同步的知識,但無法實現三個線程售出五張票的功能,因為在售出一張票之后(完成操作后)做不到既能使線程不結束又能釋放鎖資源。

為了便于理解,我來解釋一下:

要求(實現的功能)是這樣的:三個窗口(線程)公平競爭五張票,哪些窗口可以售票,一個窗口可以售多少張票由系統決定,這意味著每次運行的結果都不一樣。“希望線程不結束”是因為該線程售出一張票后仍然有機會售票,“又能釋放鎖資源”是因為其他線程也可以售票。

以下是我的代碼,望大神賜教,不勝感激:

public class SoldTicketThread implements Runnable {

private int ticket=5;

Object lock=new Object();

public void run() {

synchronized(lock){

while(ticket<=0){

try {

lock.wait();

} catch (InterruptedException e) {

System.out.println("已售空,請等待");

}

}

/*while(ticket>0){

System.out.println(Thread.currentThread().getName()+

"賣出了一張票,剩余"+(--ticket)+"張票");

}*/

System.out.println(Thread.currentThread().getName()+

"賣出了一張票,剩余"+(--ticket)+"張票");

//Thread.yield();

lock.notifyAll();

}

}

}

在另一個文件(類)測試:

public class MainMenu {

public static void main(String[] args) {

SoldTicketThread window=new SoldTicketThread();

Thread wd1=new Thread(window,"窗口二");

Thread wd2=new Thread(window,"窗口一");

Thread wd3=new Thread(window,"窗口三");

wd1.start();

wd2.start();

wd3.start();

try {

wd1.join();

wd2.join();

wd3.join();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}


正在回答

3 回答

16年的帖子 19年的回答。。。

0 回復 有任何疑惑可以回復我~
class?MyThread2?implements?Runnable{
????private?int?ticketsCont?=?100;//一共5張火車票
????private?final?Object?lockObj?=?new?Object();

????@Override
????public?void?run()?{
????????while?(true){
????????????synchronized?(lockObj){
????????????????while?(ticketsCont<=0){
??????????????????System.out.println(Thread.currentThread().getName()+"沒票了");
????????????????????try?{
????????????????????????lockObj.wait();
????????????????????}?catch?(InterruptedException?e)?{
????????????????????????e.printStackTrace();
????????????????????}
????????????????}
????????????????ticketsCont--;????//如果還有票,就賣掉一張
????????????????System.out.println(Thread.currentThread().getName()+"賣了一張票,剩余票數為"+ticketsCont);
????????????????try?{
????????????????????Thread.sleep(500);
????????????????}?catch?(InterruptedException?e)?{
????????????????????e.printStackTrace();
????????????????}
????????????????lockObj.notifyAll();

????????????}
????????}


????}
}
public?class?TicketsRunnable?{
????public?static?void?main(String[]?args)?{

????????MyThread2?mt?=new?MyThread2();
????????//創建三個線程,模擬三個窗口賣票
????????Thread?th1?=?new?Thread(mt,"窗口1");
????????Thread?th2?=?new?Thread(mt,"窗口2");
????????Thread?th3?=?new?Thread(mt,"窗口3");
????????//啟動這三個線程
????????th1.start();
????????th2.start();
????????th3.start();

????}
}

運行結果 我的可以實現 你可以參考一下? 有問題可以探討哈

窗口1賣了一張票,剩余票數為99
窗口1賣了一張票,剩余票數為98
窗口1賣了一張票,剩余票數為97
窗口1賣了一張票,剩余票數為96
窗口1賣了一張票,剩余票數為95
窗口1賣了一張票,剩余票數為94
窗口1賣了一張票,剩余票數為93
窗口1賣了一張票,剩余票數為92
窗口1賣了一張票,剩余票數為91
窗口1賣了一張票,剩余票數為90
窗口1賣了一張票,剩余票數為89
窗口1賣了一張票,剩余票數為88
窗口1賣了一張票,剩余票數為87
窗口1賣了一張票,剩余票數為86
窗口1賣了一張票,剩余票數為85
窗口1賣了一張票,剩余票數為84
窗口3賣了一張票,剩余票數為83
窗口3賣了一張票,剩余票數為82
窗口3賣了一張票,剩余票數為81
窗口2賣了一張票,剩余票數為80
窗口2賣了一張票,剩余票數為79
窗口2賣了一張票,剩余票數為78
窗口2賣了一張票,剩余票數為77
窗口3賣了一張票,剩余票數為76
窗口3賣了一張票,剩余票數為75
窗口3賣了一張票,剩余票數為74
窗口3賣了一張票,剩余票數為73
窗口3賣了一張票,剩余票數為72
窗口3賣了一張票,剩余票數為71
窗口3賣了一張票,剩余票數為70
窗口3賣了一張票,剩余票數為69
窗口3賣了一張票,剩余票數為68
窗口3賣了一張票,剩余票數為67
窗口3賣了一張票,剩余票數為66
窗口3賣了一張票,剩余票數為65
窗口3賣了一張票,剩余票數為64
窗口3賣了一張票,剩余票數為63
窗口3賣了一張票,剩余票數為62
窗口3賣了一張票,剩余票數為61
窗口1賣了一張票,剩余票數為60
窗口1賣了一張票,剩余票數為59
窗口1賣了一張票,剩余票數為58
窗口1賣了一張票,剩余票數為57
窗口1賣了一張票,剩余票數為56
窗口1賣了一張票,剩余票數為55
窗口1賣了一張票,剩余票數為54
窗口1賣了一張票,剩余票數為53
窗口1賣了一張票,剩余票數為52
窗口1賣了一張票,剩余票數為51
窗口1賣了一張票,剩余票數為50
窗口1賣了一張票,剩余票數為49
窗口1賣了一張票,剩余票數為48
窗口1賣了一張票,剩余票數為47
窗口1賣了一張票,剩余票數為46
窗口1賣了一張票,剩余票數為45
窗口1賣了一張票,剩余票數為44
窗口1賣了一張票,剩余票數為43
窗口1賣了一張票,剩余票數為42
窗口3賣了一張票,剩余票數為41
窗口2賣了一張票,剩余票數為40
窗口2賣了一張票,剩余票數為39
窗口2賣了一張票,剩余票數為38
窗口2賣了一張票,剩余票數為37
窗口2賣了一張票,剩余票數為36
窗口2賣了一張票,剩余票數為35
窗口2賣了一張票,剩余票數為34
窗口2賣了一張票,剩余票數為33
窗口2賣了一張票,剩余票數為32
窗口2賣了一張票,剩余票數為31
窗口2賣了一張票,剩余票數為30
窗口3賣了一張票,剩余票數為29
窗口3賣了一張票,剩余票數為28
窗口3賣了一張票,剩余票數為27
窗口3賣了一張票,剩余票數為26
窗口3賣了一張票,剩余票數為25
窗口1賣了一張票,剩余票數為24
窗口1賣了一張票,剩余票數為23
窗口1賣了一張票,剩余票數為22
窗口1賣了一張票,剩余票數為21
窗口1賣了一張票,剩余票數為20
窗口1賣了一張票,剩余票數為19
窗口1賣了一張票,剩余票數為18
窗口1賣了一張票,剩余票數為17
窗口3賣了一張票,剩余票數為16
窗口3賣了一張票,剩余票數為15
窗口3賣了一張票,剩余票數為14
窗口3賣了一張票,剩余票數為13
窗口3賣了一張票,剩余票數為12
窗口3賣了一張票,剩余票數為11
窗口2賣了一張票,剩余票數為10
窗口3賣了一張票,剩余票數為9
窗口3賣了一張票,剩余票數為8
窗口3賣了一張票,剩余票數為7
窗口3賣了一張票,剩余票數為6
窗口3賣了一張票,剩余票數為5
窗口3賣了一張票,剩余票數為4
窗口3賣了一張票,剩余票數為3
窗口3賣了一張票,剩余票數為2
窗口3賣了一張票,剩余票數為1
窗口3賣了一張票,剩余票數為0
窗口3沒票了
窗口1沒票了
窗口2沒票了
0 回復 有任何疑惑可以回復我~
#1

毒打妻兒田教授

有問題多多探討。
2019-10-10 回復 有任何疑惑可以回復我~

你每個線程只執行了一次呀思密達。你的關注點只落在鎖上了,忽略了每個線程要去循環執行呀。

public void run() {

while(true){

synchronized(lock){

while(ticket<=0){

System.out.println(Thread.currentThread().getName()+

"while剩余"+ticket+"張票");

try {

lock.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}


}

System.out.println(Thread.currentThread().getName()+

"賣出了一張票,剩余"+(--ticket)+"張票");

lock.notifyAll();

}

}

}


0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

用互斥與同步的知識寫售票系統

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號