* 多线程实现方式二:模拟电影院三个窗口同时出售100张票
*
* 加入延时操作,模拟真实场景
* 存在问题
* 1)一张票被卖多次
* 线程在执行的时候(随机性),具有原子性(最简单的最基本操作)特点
* 2)出现负票
* 延迟操作(导致负票)
public class SellTicketDemo {
public static void main(String[] args) {
//创建资源类对象
SellTicket st=new SellTicket();
//创建线程类对象
Thread t1=new Thread(st,"hello");
Thread t2=new Thread(st,"world");
Thread t3=new Thread(st,"java");
//启动线程
t1.start();
t2.start();
t3.start();
}
}
public class SellTicket implements Runnable {
private static int tickets=100;
@Override
public void run() {
// while(true) {
// if(tickets>0) {
// //模拟真实的延迟
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName()+"正在出售第"+(tickets--)+"张票");
/*
* 线程的特点:执行的时候原子性操作:(tickets--):出现同票(同一张票被卖多次)
* 变量--(记录元始值:100),然后在原始值基础上自减1
* t1抢占CPU执行权,睡眠--醒,正在输出“出售第100张票”的时候,t2进来
* t2睡眠醒来,在t1执行tichet--的时候,t2执行了的tickets变量:100(并发
* */
//
// }
//
// }
while(true) {
if(tickets>0) {
//模拟真实的延迟
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+(tickets--)+"张票");
/*
*
*
* */
}
}
}
}