用互斥與同步的知識寫售票系統(tǒng)
我在run()方法里運(yùn)用了互斥與同步的知識,但無法實(shí)現(xiàn)三個線程售出五張票的功能,因?yàn)樵谑鄢鲆粡埰敝螅ㄍ瓿刹僮骱螅┳霾坏?strong>既能使線程不結(jié)束又能釋放鎖資源。
為了便于理解,我來解釋一下:
要求(實(shí)現(xiàn)的功能)是這樣的:三個窗口(線程)公平競爭五張票,哪些窗口可以售票,一個窗口可以售多少張票由系統(tǒng)決定,這意味著每次運(yùn)行的結(jié)果都不一樣。“希望線程不結(jié)束”是因?yàn)樵摼€程售出一張票后仍然有機(jī)會售票,“又能釋放鎖資源”是因?yàn)槠渌€程也可以售票。
以下是我的代碼,望大神賜教,不勝感激:
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();
}
}
}
2020-04-08
16年的帖子 19年的回答。。。
2019-10-10
運(yùn)行結(jié)果 我的可以實(shí)現(xiàn) 你可以參考一下? 有問題可以探討哈
2016-09-18
你每個線程只執(zhí)行了一次呀思密達(dá)。你的關(guān)注點(diǎn)只落在鎖上了,忽略了每個線程要去循環(huán)執(zhí)行呀。
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();
}
}
}