题目
开启多个售票窗口同时进行火车票的售卖
分析
多线程卖票
前置条件:
设置总票数 ,比如20张
开启多个售票窗口同时进行火车票的售卖 (这里多个窗口代表 多线程. 代表启动了多少个线程对象)
怎么卖票 ? 借助循环 重复卖票动作 ,使用 while死循环
每卖出1张 ,总票数 -- 操作 .
什么时候退出循环?
发现卖完了,退出循环
开启线程 ,执行 run方法内部逻辑
单线程卖票 ,是没问题的 .多线程卖票,就出现了并发问题 要解决该问题 ,需要使用"同步操作"
synchronized() 括弧内部是 同步锁对象 .
为什么加了synchronized ,就可以解决刚才问题 ....
package com.cpd.work;
/**
* 三个窗口同时卖票 用 实现Runnable方式
*/
package com.cpd.work;
/**
* 三个窗口同时卖票 用 实现Runnable方式
*/
public class TickeRunnable implements Runnable {
private static int num=1;
private static Object obj = new Object();
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);//单位是毫秒值
synchronized (obj){
if(num<16){
System.out.println("线程"+Thread.currentThread().getName()+":当前卖出:"+num+"号票..");
num++; //每卖出1张 ,要减去1张
}else{
System.out.println("当前车次的票已售完...");
System.exit(0); //退出程序
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TickeRunnable r=new TickeRunnable();
Thread t=new Thread(r);
t.start();
TickeRunnable r2=new TickeRunnable();
Thread t2=new Thread(r2);
t2.start();
TickeRunnable r3=new TickeRunnable();
Thread t3=new Thread(r3);
t3.start();
}
}