Java基础----一个有问题的多线程程序

来源:互联网 发布:手机淘宝闲置区在哪里 编辑:程序博客网 时间:2024/06/13 00:53

package cn.itcast_08;public class SellTicket implements Runnable {// 定义100张票private int tickets = 100;//@Override//public void run() {//while (true) {//// t1,t2,t3三个线程//// 这一次的tickets = 100;//if (tickets > 0) {//// 为了模拟更真实的场景,我们稍作休息//try {//Thread.sleep(100); // t1就稍作休息,t2就稍作休息//} catch (InterruptedException e) {//e.printStackTrace();//}////System.out.println(Thread.currentThread().getName() + "正在出售第"//+ (tickets--) + "张票");//// 理想状态://// 窗口1正在出售第100张票//// 窗口2正在出售第99张票//// 但是呢?//// CPU的每一次执行必须是一个原子性(最简单基本的)的操作。//// 先记录以前的值//// 接着把ticket--//// 然后输出以前的值(t2来了)//// ticket的值就变成了99//// 窗口1正在出售第100张票//// 窗口2正在出售第100张票////}//}//}@Overridepublic void run() {while (true) {// t1,t2,t3三个线程// 这一次的tickets = 1;if (tickets > 0) {// 为了模拟更真实的场景,我们稍作休息try {Thread.sleep(100); //t1进来了并休息,t2进来了并休息,t3进来了并休息,} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在出售第"+ (tickets--) + "张票");//窗口1正在出售第1张票,tickets=0//窗口2正在出售第0张票,tickets=-1//窗口3正在出售第-1张票,tickets=-2}}}}

package cn.itcast_08;/* * 实现Runnable接口的方式实现 *  * 通过加入延迟后,就产生了连个问题: * A:相同的票卖了多次 * CPU的一次操作必须是原子性的 * B:出现了负数票 * 随机性和延迟导致的 */public class SellTicketDemo {public static void main(String[] args) {// 创建资源对象SellTicket st = new SellTicket();// 创建三个线程对象Thread t1 = new Thread(st, "窗口1");Thread t2 = new Thread(st, "窗口2");Thread t3 = new Thread(st, "窗口3");// 启动线程t1.start();t2.start();t3.start();}}



0 0
原创粉丝点击