- 1 public class SellTicketDemo {
- 2 public static void main(String[] args) {
- 3 // 创建资源对象
- 4 SellTicket st = new SellTicket();
- 5 6 // 创建三个线程对象
- 7 Thread t1 = new Thread(st, "窗口1");
- 8 Thread t2 = new Thread(st, "窗口2");
- 9 Thread t3 = new Thread(st, "窗口3");
- 10 11 // 启动线程
- 12 t1.start();
- 13 t2.start();
- 14 t3.start();
- 15
- }
- 16
- }
- 17 public class SellTicket implements Runnable {
- 18 // 定义100张票
- 19 private int tickets = 100;
- 20 21 // @Override
- 22 // public void run() {
- 23 // while (true) {
- 24 // // t1,t2,t3三个线程
- 25 // // 这一次的tickets = 100;
- 26 // if (tickets > 0) {
- 27 // // 为了模拟更真实的场景,我们稍作休息
- 28 // try {
- 29 // Thread.sleep(100); // t1就稍作休息,t2就稍作休息
- 30 // } catch (InterruptedException e) {
- 31 // e.printStackTrace();
- 32 // }
- 33 //
- 34 // System.out.println(Thread.currentThread().getName() + "正在出售第"
- 35 // + (tickets--) + "张票");
- 36 // // 理想状态:
- 37 // // 窗口1正在出售第100张票
- 38 // // 窗口2正在出售第99张票
- 39 // // 但是呢?
- 40 // // CPU的每一次执行必须是一个原子性(最简单基本的)的操作。
- 41 // // 先记录以前的值
- 42 // // 接着把ticket--
- 43 // // 然后输出以前的值(t2来了)
- 44 // // ticket的值就变成了99
- 45 // // 窗口1正在出售第100张票
- 46 // // 窗口2正在出售第100张票
- 47 //
- 48 // }
- 49 // }
- 50 // }
- 51 52@Override 53 public void run() {
- 54
- while (true) {
- 55 // t1,t2,t3三个线程
- 56 // 这一次的tickets = 1;
- 57
- if (tickets > 0) {
- 58 // 为了模拟更真实的场景,我们稍作休息
- 59
- try {
- 60 Thread.sleep(100); //t1进来了并休息,t2进来了并休息,t3进来了并休息,
- 61
- } catch(InterruptedException e) {
- 62 e.printStackTrace();
- 63
- }
- 64 65 System.out.println(Thread.currentThread().getName() + "正在出售第"66 + (tickets--) + "张票");
- 67 //窗口1正在出售第1张票,tickets=0
- 68 //窗口2正在出售第0张票,tickets=-1
- 69 //窗口3正在出售第-1张票,tickets=-2
- 70
- }
- 71
- }
- 72
- }
- 73
- }
来源: