多线程

    xiaoxiao2021-03-25  64

    package cn.itcast_08; /* * 某电影院正在上映贺岁大片(情圣,超级快递),共有100张票,而他有3个窗品售票,请设置一个程序模拟该电影院售票。 * 实现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(); } }

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

    转载请注明原文地址: https://ju.6miu.com/read-36481.html

    最新回复(0)