用互斥与同步知识写售票系统(最后一节视频有要求)
我在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();
}
}
}