zoukankan      html  css  js  c++  java
  • java多线程(三)之售票案例

    售票案例:

    火车站3个窗口售100张票.

    1.自定义类SellTicket.java

     1 package com.test.com.pers.thread;
     2 
     3 /**
     4  * Created by yadongliang on 2018/1/17 0017.
     5  */
     6 public class SellTicket implements Runnable {
     7 
     8     // 定义票数
     9     private int ticketCount = 100;
    10     // 定义锁对象
    11     private Object object = new Object();
    12 
    13     @Override
    14     public void run() {
    15         while(true){
    16             synchronized(object){// 同步机制, 同步代码块
    17                 if (ticketCount > 0){
    18                     try {
    19                         Thread.sleep(100);// 为了模拟真实场景, 延迟100毫秒, 这样会出现同票和负数票(随机性和延迟性导致)问题(线程安全问题)
    20                     } catch (InterruptedException e) {
    21                         e.printStackTrace();
    22                     }
    23                     System.out.println(Thread.currentThread().getName() + " 正在出售第: " + (ticketCount--) + " 张票...");
    24                 }
    25             }
    26         }
    27     }
    28 }

    2.SellTicketDemo.java

    package com.test.com.pers.thread;
    
    /**
     * Created by yadongliang on 2018/1/17 0017.
     *
     * 如何解决线程安全问题:
     *  要想解决线程安全问题, 首先要知道哪些原因会导致出问题:(这些问题也是判断一个程序是否会有安全问题的标准)
     *      1.是否是多线程环境
     *      2.是否有共享数据
     *      3.是否有多条语句操作共享数据(是否是原子性操作)
     * 如何解决呢?
     *  思想:
     *      把多条语句操作共享数据的代码包成一个整体, 让某个线程执行的过程中, 别的线程不能执行.
     *  具体操作:
     *      引入了同步机制这个概念.
     *  同步代码块:
     *      synchronized(对象){
     *          需要同步的代码;
     *      }
     *      1.对象是什么?
     *          可以随便创建一个对象
     *      2.需要同步的代码是什么?
     *          多条语句操作共享数据的代码
     *      注意: 同步可以解决线程安全问题的根本原因就在这个对象身上, 该对象如同锁的功能, 多个线程必须是同一把锁.
     */
    public class SellTicketDemo {
    
        public static void main(String[] args) {
            // 创建自定义类实例
            SellTicket sellTicket = new SellTicket();
            // 创建线程对象(窗口)
            Thread t1 = new Thread(sellTicket, "窗口1");
            Thread t2 = new Thread(sellTicket, "窗口2");
            Thread t3 = new Thread(sellTicket, "窗口3");
            // 启动线程
            t1.start();
            t2.start();
            t3.start();
        }
    }

    执行结果:

      1 窗口1 正在出售第: 100 张票...
      2 窗口1 正在出售第: 99 张票...
      3 窗口1 正在出售第: 98 张票...
      4 窗口1 正在出售第: 97 张票...
      5 窗口1 正在出售第: 96 张票...
      6 窗口1 正在出售第: 95 张票...
      7 窗口1 正在出售第: 94 张票...
      8 窗口1 正在出售第: 93 张票...
      9 窗口1 正在出售第: 92 张票...
     10 窗口1 正在出售第: 91 张票...
     11 窗口1 正在出售第: 90 张票...
     12 窗口1 正在出售第: 89 张票...
     13 窗口1 正在出售第: 88 张票...
     14 窗口1 正在出售第: 87 张票...
     15 窗口1 正在出售第: 86 张票...
     16 窗口1 正在出售第: 85 张票...
     17 窗口1 正在出售第: 84 张票...
     18 窗口1 正在出售第: 83 张票...
     19 窗口1 正在出售第: 82 张票...
     20 窗口1 正在出售第: 81 张票...
     21 窗口1 正在出售第: 80 张票...
     22 窗口1 正在出售第: 79 张票...
     23 窗口3 正在出售第: 78 张票...
     24 窗口3 正在出售第: 77 张票...
     25 窗口3 正在出售第: 76 张票...
     26 窗口3 正在出售第: 75 张票...
     27 窗口3 正在出售第: 74 张票...
     28 窗口3 正在出售第: 73 张票...
     29 窗口2 正在出售第: 72 张票...
     30 窗口3 正在出售第: 71 张票...
     31 窗口3 正在出售第: 70 张票...
     32 窗口3 正在出售第: 69 张票...
     33 窗口3 正在出售第: 68 张票...
     34 窗口3 正在出售第: 67 张票...
     35 窗口3 正在出售第: 66 张票...
     36 窗口3 正在出售第: 65 张票...
     37 窗口3 正在出售第: 64 张票...
     38 窗口3 正在出售第: 63 张票...
     39 窗口3 正在出售第: 62 张票...
     40 窗口3 正在出售第: 61 张票...
     41 窗口3 正在出售第: 60 张票...
     42 窗口3 正在出售第: 59 张票...
     43 窗口3 正在出售第: 58 张票...
     44 窗口3 正在出售第: 57 张票...
     45 窗口1 正在出售第: 56 张票...
     46 窗口1 正在出售第: 55 张票...
     47 窗口1 正在出售第: 54 张票...
     48 窗口1 正在出售第: 53 张票...
     49 窗口1 正在出售第: 52 张票...
     50 窗口3 正在出售第: 51 张票...
     51 窗口2 正在出售第: 50 张票...
     52 窗口2 正在出售第: 49 张票...
     53 窗口3 正在出售第: 48 张票...
     54 窗口3 正在出售第: 47 张票...
     55 窗口3 正在出售第: 46 张票...
     56 窗口3 正在出售第: 45 张票...
     57 窗口3 正在出售第: 44 张票...
     58 窗口3 正在出售第: 43 张票...
     59 窗口1 正在出售第: 42 张票...
     60 窗口1 正在出售第: 41 张票...
     61 窗口1 正在出售第: 40 张票...
     62 窗口3 正在出售第: 39 张票...
     63 窗口3 正在出售第: 38 张票...
     64 窗口3 正在出售第: 37 张票...
     65 窗口3 正在出售第: 36 张票...
     66 窗口3 正在出售第: 35 张票...
     67 窗口3 正在出售第: 34 张票...
     68 窗口3 正在出售第: 33 张票...
     69 窗口3 正在出售第: 32 张票...
     70 窗口2 正在出售第: 31 张票...
     71 窗口3 正在出售第: 30 张票...
     72 窗口3 正在出售第: 29 张票...
     73 窗口3 正在出售第: 28 张票...
     74 窗口3 正在出售第: 27 张票...
     75 窗口3 正在出售第: 26 张票...
     76 窗口1 正在出售第: 25 张票...
     77 窗口1 正在出售第: 24 张票...
     78 窗口1 正在出售第: 23 张票...
     79 窗口1 正在出售第: 22 张票...
     80 窗口1 正在出售第: 21 张票...
     81 窗口1 正在出售第: 20 张票...
     82 窗口1 正在出售第: 19 张票...
     83 窗口1 正在出售第: 18 张票...
     84 窗口1 正在出售第: 17 张票...
     85 窗口3 正在出售第: 16 张票...
     86 窗口2 正在出售第: 15 张票...
     87 窗口2 正在出售第: 14 张票...
     88 窗口2 正在出售第: 13 张票...
     89 窗口3 正在出售第: 12 张票...
     90 窗口3 正在出售第: 11 张票...
     91 窗口3 正在出售第: 10 张票...
     92 窗口3 正在出售第: 9 张票...
     93 窗口3 正在出售第: 8 张票...
     94 窗口3 正在出售第: 7 张票...
     95 窗口1 正在出售第: 6 张票...
     96 窗口1 正在出售第: 5 张票...
     97 窗口1 正在出售第: 4 张票...
     98 窗口1 正在出售第: 3 张票...
     99 窗口1 正在出售第: 2 张票...
    100 窗口1 正在出售第: 1 张票...
    View Code
  • 相关阅读:
    每日总结
    每日总结
    每日总结
    每日总结
    每周总结
    每日总结
    10.20
    10.19
    10.18
    10.17
  • 原文地址:https://www.cnblogs.com/yadongliang/p/8305045.html
Copyright © 2011-2022 走看看