演示使用线程的注意事项(解决线程并发的问题)

/**
 * 2018.9.5
 * 作者:小孟鱼
 * 功能:演示使用线程的注意事项
 * 实例:模拟一个航空售系统:有3个售票点,在一天内卖出2000张票(注意不是买个售票点卖2000张,
 *     而是一共卖出2000张票)
 */
package com.xianchen2;

public class Xianchen4 {
        public static void main(String[] args) {
            
            //定义3个售票窗口
            TicketWindow tw1=new TicketWindow();
            //TicketWindow tw2=new TicketWindow();
            //TicketWindow tw3=new TicketWindow();
            
            Thread t1=new Thread(tw1);
            Thread t2=new Thread(tw1);
            Thread t3=new Thread(tw1);
            
            
            t1.start();
            t2.start();
            t3.start();
            
        }
}


//创建一个售票窗口的类
class TicketWindow implements Runnable
{
    //一个有2000张票
    private int nums=2000;
    
    public void run()
    {
        while(true)
        {
        
            //先判断是否还有票
            //认为if else要保证其原子性{同步代码块}而这个This指的是对象锁
            synchronized (this) {
                
            
            if(nums>0)  
            {
                
                //出票速度是1s出一张
                try {
                    Thread.sleep(100);
                } catch (Exception e) {
                    // TODO: handle exception
                    
                    e.printStackTrace();//抛出异常
                }
                
                //显示信息
                //Thread.currentThread().getName()这句话的意思是:当前线程的名字
                System.out.println(Thread.currentThread().getName()+"正在售出第"+nums+"张票");
                nums--;
            }else
            {
                //已售完
                break;
            }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42133768/article/details/82429383