用互斥與同步知識寫售票系統(tǒng)(最后一節(jié)視頻有要求)
我在run()方法里運用了互斥與同步的知識,但無法實現(xiàn)三個線程售出五張票的功能,因為在售出一張票之后(完成操作后)做不到既能使線程不結(jié)束又能釋放鎖資源。
為了便于理解,我來解釋一下:
要求(實現(xiàn)的功能)是這樣的:三個窗口(線程)公平競爭五張票,哪些窗口可以售票,一個窗口可以售多少張票由系統(tǒng)決定,這意味著每次運行的結(jié)果都不一樣?!跋M€程不結(jié)束”是因為該線程售出一張票后仍然有機會售票,“又能釋放鎖資源”是因為其他線程也可以售票。
以下是我的代碼,望大神賜教,不勝感激:
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();
}
}
}
2016-07-31
public class SoldTicketThread implements Runnable {
private int ticket = 5;
private synchronized void sale() {
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "賣出了一張票,剩余"
+ (--ticket) + "張票");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void run() {
while (ticket > 0) {
sale();
// 這里要確保進入賣票環(huán)節(jié)前就把資源鎖住
}
}
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();
}
}
你本身的邏輯就出錯了,賣票的操作肯定要在循環(huán)體里面,而且要鎖定的內(nèi)容是整個賣票過程的操作。