diff --git a/s-day06/src/com/inmind/thread_safe04/Demo05.java b/s-day06/src/com/inmind/thread_safe04/Demo05.java new file mode 100644 index 0000000..283d1a7 --- /dev/null +++ b/s-day06/src/com/inmind/thread_safe04/Demo05.java @@ -0,0 +1,29 @@ +package com.inmind.thread_safe04; +/* +电影院要卖票,我们模拟电影院的卖票过程。假设要播放的电影是 “葫芦娃大战奥特曼”,本次电影的座位共100个(本场电影只能卖100张票)。 + +我们来模拟电影院的售票窗口,实现多个窗口同时卖 “葫芦娃大战奥特曼”这场电影票(多个窗口一起卖这100张票) + +需要窗口,采用线程对象来模拟;需要票,Runnable接口子类来模拟 + +注意:在栈中是线程私有的,在堆中是线程共享 +当前的情况就是100张票(卖票的任务),要被3个窗口(线程)共享 +分析: +1.定义卖票任务,卖100张票 +2.创建3个窗口线程,去执行同一个任务 + +总结:当多个线程去操作同一个数据时就会发生线程安全问题,它的执行结果跟我们的预想不一样 + */ +public class Demo05 { + public static void main(String[] args) { + //创建卖票任务 + TicketTask ticketTask = new TicketTask(); + //创建3个窗口线程,去执行同一个任务 + /*Thread thread1 = new Thread(ticketTask, "窗口1"); + thread1.start();*/ + new Thread(ticketTask, "窗口1").start(); + //请问接下来创建窗口2和窗口3的时候,需要重新创建ticketTask对象吗???绝对不行,因为我们要卖同一个场次的100张票,如果new,那就不是100张 + new Thread(ticketTask,"窗口2").start(); + new Thread(ticketTask,"窗口3").start(); + } +} diff --git a/s-day06/src/com/inmind/thread_safe04/TicketTask.java b/s-day06/src/com/inmind/thread_safe04/TicketTask.java new file mode 100644 index 0000000..56aff9b --- /dev/null +++ b/s-day06/src/com/inmind/thread_safe04/TicketTask.java @@ -0,0 +1,28 @@ +package com.inmind.thread_safe04; + +//卖票任务:就是卖100张票 +public class TicketTask implements Runnable{ + int ticketCount = 100;//100张票 + + @Override + public void run() { + //有票就卖 + while (true) { + //如果有票就卖 + if (ticketCount > 0) { + + //模拟卖票时间 + try { + Thread.sleep(50); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.println(Thread.currentThread().getName() + "正在卖第" + ticketCount + "张票"); + ticketCount--; + } else { + break;//结束循环 + } + } + } +}