假設有火車票100張,創建10個線程模擬10個售票點,每個售票點隨機生成時間賣一張票。 打印出售票過程,注意使用synchronized確保同一張票只能賣出一次。
import java.text.SimpleDateFormat;
import java.util.Date;
public class Resource {
int ticketNum;
boolean flag = false;
SimpleDateFormat sdf;
int i = 1;
public Resource(int ticketNum) {
this.ticketNum = ticketNum;
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
}
public synchronized void sellTicket(Seller s) {
if (i <= ticketNum) {
System.out.println("在" + sdf.format(new Date()) + " 第" + s.num
+ "售票點賣了第" + i + "張票...");
i++;
} else {
flag = true;
}
}
}
public class Seller implements Runnable {
int num;
Resource rs;
public Seller(int num, Resource rs) {
super();
this.num = num;
this.rs = rs;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (rs.flag == false) {
// 調用資源類的同步方法
rs.sellTicket(this);
try {
// 生成隨機數(範圍1-1000)
int random = (int) (Math.random() * 1000);
Thread.sleep(random);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Resource rs = new Resource(100);
for (int i = 0; i < 10; i++) {
Thread t = new Thread(new Seller(i, rs));
t.start();
}
}
}