有票站、买票、卖票组成的经典多线程案例
package com;
public class TestSellTicket {
public static void main(String[] args) {
// TODO Auto-generated method stub
TicketManager t=new TicketManager();
SellTicket s1=new SellTicket(t);
SellTicket s2=new SellTicket(t);
PutTicket p=new PutTicket(t);
//启动线程
s1.start();
s2.start();
p.start();
}
}
//////////////////////////////////////////////////////
class TicketManager {
// 票数
int ticketCount = 100;
public void sellTicket() {
// 卖
synchronized (this) {
ticketCount--;
System.out.println(Thread.currentThread().getName() + "卖掉了一张,剩余" + ticketCount);
if (ticketCount <= 0) {
this.notifyAll();// 通知别进程一个线程
try {
this.wait(); // 进入等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 睡眠
}
}
}
//
public void putTicket() {
synchronized (this) {
if (ticketCount <= 0) {
ticketCount = 100;// 加票
System.out.println("已经放了"+ticketCount);
this.notifyAll(); // 通知所有等待线程
try {
this.wait(); // 停下来
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
////////////////////////////////////////////////////
// 卖票
class SellTicket extends Thread {
private TicketManager ticketManager;
public SellTicket(TicketManager t) {
// TODO Auto-generated constructor stub
this.ticketManager = t;
}
@Override
public void run() {
// TODO Auto-generated method stub
// super.run();
while (true) {
this.ticketManager.sellTicket(); // 卖票
try {
sleep(100); // 休息一会
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//////////////////////////////////
// 放票
class PutTicket extends Thread {
private TicketManager ticketManager;
public PutTicket(TicketManager t) {
// TODO Auto-generated constructor stub
this.ticketManager = t;
}
@Override
public void run() {
// TODO Auto-generated method stub
// super.run();
//
while (true) {
this.ticketManager.putTicket();
}
}
}