ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多线程的同步

2019-11-02 13:55:06  阅读:238  来源: 互联网

标签:正在 窗口 Thread 张票 50 同步 多线程 发售


案件引入: 电影院 4个窗口 售卖50张电影票

 

package com.example02;
public class Ticket01 extends Thread {   
/* 模拟火车站窗口售票场景: 4个窗口发售 某次列车的50张车票
*可以将50张车票 看作是共享资源
*4个窗口,则需要创建4个线程
*/
    private int tickets=50;
    private String name;
    
    public Ticket01(String name) {
        this.name=name;
    }
    public void run() {
        
        while(true) {                      //通过死循环语句打印语句
            if(tickets>0) {       
                //while循环依次对ticket属性进行自减操作,以模拟售票的过程,直到ticket属性值为0时,跳出循环
                System.out.println(name+"正在发售第"+  tickets--  +"张票");  
            }else {
                break;
            }
        }
    }
    public static void main(String[] args) {   // 定义4个线程对象,代表4个售票窗口
        
        Ticket01 t1 = new Ticket01("窗口1");
        Ticket01 t2 = new Ticket01("窗口2");
        Ticket01 t3 = new Ticket01("窗口3");
        Ticket01 t4 = new Ticket01("窗口4");
        t1.start();                             //启动4个线程
        t2.start();
        t3.start();
        t4.start();
    }

}

结果

 

窗口2正在发售第50张票
窗口1正在发售第50张票
窗口1正在发售第49张票
窗口1正在发售第48张票
窗口1正在发售第47张票
窗口1正在发售第46张票
窗口1正在发售第45张票
窗口1正在发售第44张票
窗口1正在发售第43张票
窗口1正在发售第42张票
窗口1正在发售第41张票
窗口1正在发售第40张票
窗口1正在发售第39张票
窗口1正在发售第38张票
窗口1正在发售第37张票
窗口1正在发售第36张票
窗口1正在发售第35张票
窗口1正在发售第34张票
窗口1正在发售第33张票
窗口1正在发售第32张票
窗口1正在发售第31张票
窗口1正在发售第30张票
窗口1正在发售第29张票
窗口1正在发售第28张票
窗口1正在发售第27张票
窗口1正在发售第26张票
窗口1正在发售第25张票
窗口1正在发售第24张票
窗口1正在发售第23张票
窗口1正在发售第22张票
窗口1正在发售第21张票
窗口1正在发售第20张票
窗口1正在发售第19张票
窗口1正在发售第18张票
窗口1正在发售第17张票
窗口1正在发售第16张票
窗口1正在发售第15张票
窗口1正在发售第14张票
窗口1正在发售第13张票
窗口1正在发售第12张票
窗口1正在发售第11张票
窗口1正在发售第10张票
窗口1正在发售第9张票
窗口1正在发售第8张票
窗口1正在发售第7张票
窗口1正在发售第6张票
窗口1正在发售第5张票
窗口1正在发售第4张票
窗口1正在发售第3张票
窗口1正在发售第2张票
窗口1正在发售第1张票
窗口2正在发售第49张票
窗口2正在发售第48张票
窗口2正在发售第47张票
窗口2正在发售第46张票
窗口3正在发售第50张票
窗口2正在发售第45张票
窗口2正在发售第44张票
窗口2正在发售第43张票
窗口2正在发售第42张票
窗口2正在发售第41张票
窗口2正在发售第40张票
窗口2正在发售第39张票
窗口2正在发售第38张票
窗口2正在发售第37张票
窗口2正在发售第36张票
窗口2正在发售第35张票
窗口2正在发售第34张票
窗口2正在发售第33张票
窗口2正在发售第32张票
窗口2正在发售第31张票
窗口2正在发售第30张票
窗口2正在发售第29张票
窗口2正在发售第28张票
窗口2正在发售第27张票
窗口2正在发售第26张票
窗口2正在发售第25张票
窗口2正在发售第24张票
窗口2正在发售第23张票
窗口2正在发售第22张票
窗口2正在发售第21张票
窗口2正在发售第20张票
窗口2正在发售第19张票
窗口2正在发售第18张票
窗口2正在发售第17张票
窗口2正在发售第16张票
窗口2正在发售第15张票
窗口2正在发售第14张票
窗口2正在发售第13张票
窗口2正在发售第12张票
窗口2正在发售第11张票
窗口2正在发售第10张票
窗口3正在发售第49张票
窗口2正在发售第9张票
窗口2正在发售第8张票
窗口2正在发售第7张票
窗口2正在发售第6张票
窗口2正在发售第5张票
窗口2正在发售第4张票
窗口2正在发售第3张票
窗口2正在发售第2张票
窗口2正在发售第1张票
窗口3正在发售第48张票
窗口3正在发售第47张票
窗口3正在发售第46张票
窗口3正在发售第45张票
窗口3正在发售第44张票
窗口3正在发售第43张票
窗口3正在发售第42张票
窗口3正在发售第41张票
窗口3正在发售第40张票
窗口3正在发售第39张票
窗口3正在发售第38张票
窗口3正在发售第37张票
窗口3正在发售第36张票
窗口3正在发售第35张票
窗口3正在发售第34张票
窗口3正在发售第33张票
窗口3正在发售第32张票
窗口3正在发售第31张票
窗口3正在发售第30张票
窗口4正在发售第50张票
窗口3正在发售第29张票
窗口4正在发售第49张票
窗口3正在发售第28张票
窗口4正在发售第48张票
窗口3正在发售第27张票
窗口4正在发售第47张票
窗口3正在发售第26张票
窗口4正在发售第46张票
窗口3正在发售第25张票
窗口4正在发售第45张票
窗口3正在发售第24张票
窗口4正在发售第44张票
窗口3正在发售第23张票
窗口4正在发售第43张票
窗口3正在发售第22张票
窗口4正在发售第42张票
窗口3正在发售第21张票
窗口4正在发售第41张票
窗口3正在发售第20张票
窗口4正在发售第40张票
窗口3正在发售第19张票
窗口4正在发售第39张票
窗口3正在发售第18张票
窗口4正在发售第38张票
窗口3正在发售第17张票
窗口4正在发售第37张票
窗口3正在发售第16张票
窗口4正在发售第36张票
窗口3正在发售第15张票
窗口4正在发售第35张票
窗口3正在发售第14张票
窗口4正在发售第34张票
窗口3正在发售第13张票
窗口4正在发售第33张票
窗口3正在发售第12张票
窗口4正在发售第32张票
窗口3正在发售第11张票
窗口4正在发售第31张票
窗口3正在发售第10张票
窗口4正在发售第30张票
窗口3正在发售第9张票
窗口4正在发售第29张票
窗口4正在发售第28张票
窗口4正在发售第27张票
窗口4正在发售第26张票
窗口4正在发售第25张票
窗口4正在发售第24张票
窗口4正在发售第23张票
窗口4正在发售第22张票
窗口4正在发售第21张票
窗口4正在发售第20张票
窗口4正在发售第19张票
窗口4正在发售第18张票
窗口4正在发售第17张票
窗口4正在发售第16张票
窗口4正在发售第15张票
窗口4正在发售第14张票
窗口3正在发售第8张票
窗口4正在发售第13张票
窗口4正在发售第12张票
窗口4正在发售第11张票
窗口4正在发售第10张票
窗口4正在发售第9张票
窗口3正在发售第7张票
窗口4正在发售第8张票
窗口3正在发售第6张票
窗口4正在发售第7张票
窗口3正在发售第5张票
窗口4正在发售第6张票
窗口3正在发售第4张票
窗口4正在发售第5张票
窗口3正在发售第3张票
窗口4正在发售第4张票
窗口3正在发售第2张票
窗口3正在发售第1张票
窗口4正在发售第3张票
窗口4正在发售第2张票
窗口4正在发售第1张票

 

 出现问题:

 总共50张票,但是结果显示:每个窗口售卖了50张票,一共售出200张票!!!!

 

改进代码:

package com.example02;
public class Ticket02 implements Runnable {   
    private int tickets=50;
     
    public void run() {
        
        while(true) {                                           //通过死循环语句打印语句
            if(tickets>0) {       
                
                String name=Thread.currentThread().getName();   //获取当前线程的名称
                
                //while循环依次对ticket属性进行自减操作,以模拟售票的过程,直到ticket属性值为0时,跳出循环
                System.out.println(name+"正在发售第"+  tickets--  +"张票");  
                
            }else {
                break;
            }
        }
    }
    public static void main(String[] args) {  
        
        //创建线程任务
        Ticket02 ticket02 = new Ticket02();
        // 定义4个线程对象,代表4个售票窗口
        Thread t1 = new Thread(ticket02,"窗口1");
        Thread t2 = new Thread(ticket02,"窗口2");
        Thread t3 = new Thread(ticket02,"窗口3");
        Thread t4 = new Thread(ticket02,"窗口4");
        //开启四个线程
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        
         
    }

}

 

 

 结果:

窗口1正在发售第50张票
窗口3正在发售第49张票
窗口3正在发售第48张票
窗口3正在发售第47张票
窗口3正在发售第46张票
窗口3正在发售第45张票
窗口3正在发售第43张票
窗口3正在发售第42张票
窗口3正在发售第41张票
窗口3正在发售第40张票
窗口3正在发售第39张票
窗口3正在发售第38张票
窗口3正在发售第37张票
窗口3正在发售第36张票
窗口3正在发售第35张票
窗口3正在发售第34张票
窗口3正在发售第33张票
窗口1正在发售第44张票
窗口1正在发售第29张票
窗口1正在发售第28张票
窗口1正在发售第27张票
窗口1正在发售第26张票
窗口1正在发售第25张票
窗口1正在发售第24张票
窗口1正在发售第23张票
窗口1正在发售第22张票
窗口1正在发售第21张票
窗口1正在发售第20张票
窗口1正在发售第19张票
窗口4正在发售第30张票
窗口4正在发售第17张票
窗口4正在发售第16张票
窗口4正在发售第15张票
窗口4正在发售第14张票
窗口4正在发售第13张票
窗口4正在发售第12张票
窗口4正在发售第11张票
窗口4正在发售第10张票
窗口4正在发售第9张票
窗口4正在发售第8张票
窗口4正在发售第7张票
窗口4正在发售第6张票
窗口4正在发售第5张票
窗口4正在发售第4张票
窗口4正在发售第3张票
窗口4正在发售第2张票
窗口4正在发售第1张票
窗口3正在发售第31张票
窗口2正在发售第32张票
窗口1正在发售第18张票

 

 

解决了问题:4个窗口共买了50张电影票


 

线程安全问题!

 

标签:正在,窗口,Thread,张票,50,同步,多线程,发售
来源: https://www.cnblogs.com/penguin1024/p/11781521.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有