我是少侠露飞。学习塑造人生,技术改变世界。
引言
利用多线程售卖火车票也是多线程手写代码的常见问题。需求很简单:创建若干线程代表车票售卖窗口,每个窗口售卖的车票不能有重复,要求写代码实现。
利用wait/notifyAll机制实现
public class Main {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread t1 = new Thread(ticket);
Thread t2 = new Thread(ticket);
Thread t3 = new Thread(ticket);
Thread t4 = new Thread(ticket);
t1.setName("窗口A");
t2.setName("窗口B");
t3.setName("窗口C");
t4.setName("窗口D");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Ticket implements Runnable {
int serialNumber = 1;
//synchronized为线程加锁,保证每次只有一个线程拿到锁进行售票
@Override
public synchronized void run() {
while (true) {
if (serialNumber <= 100) {
System.out.println(Thread.currentThread().getName() + "卖出" + serialNumber + "号票");
serialNumber++;
}
try {
// 这里wait()休眠一段时间,表示当前线程释放锁,别的线程可以拿到锁进行售票
// 注意wait()方法必须在synchronized代码里使用,因为想要释放锁的前提是,你必须首先持有锁
this.wait(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
我是少侠露飞,咱们下期见。