Java多线程简单样例(三):购票窗口实现票数同步


 
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public class ThreadTicket {
    public static void main(String[] args) {
        Booking b1 = new Booking("军人售票口");
        Booking b2 = new Booking("学生售票口");
        Booking b3 = new Booking("老年人售票口");
        Booking b4 = new Booking("网上售票口");
        b1.start();
        b2.start();
        b3.start();
        b4.start();
    }
}
 
/*
 * 多窗口卖票系统。多线程
 * 票数为静态的,共享数据
 * synchronized(对象){}代码块中的内容是加锁的,
 * 即当一个线程在使用时,其他线程不可以进入。
 * 使得共享资源数据的安全。
 */
class Booking extends Thread{
    public  Booking(String name){
        super(name);
    }  
    static  int ticket = 50;//票数共50张
    Lock lock = new ReentrantLock();//明锁
    /*
    * Lock是个接口,只能实例化它的子类
    * 明锁适合高并发,上万
    * 暗锁适合并发率不高时,效率高
    */
    
   //重写run方法,
   public void run(){         
           while(ticket>0){
                   synchronized (Booking.class) {
                       if (ticket>0) {
                           System.out.println(super.getName()+"窗口---->卖出的车票号No."+ticket);
                           ticket--;
                       }else {
                           System.out.println(super.getName()+"票已售罄!!!");
                       }              
                    try {
                       sleep(100);//睡100毫秒,抛出多线程异常
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
              }
                   /*lock.lock();//加锁,锁定以下代码
                   if (ticket>0) {
                       System.out.println(super.getName()+"卖票:"+ticket);
                       ticket--;
                   }else {
                       System.out.println(super.getName()+"票已售罄!!!");
                   }
                   try {
                       Thread.sleep(100);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   lock.unlock();//解锁
*/      }      
        
   }
}

运行结果如下:

军人售票口窗口---->卖出的车票号No.50
网上售票口窗口---->卖出的车票号No.49
老年人售票口窗口---->卖出的车票号No.48
学生售票口窗口---->卖出的车票号No.47
老年人售票口窗口---->卖出的车票号No.46
网上售票口窗口---->卖出的车票号No.45
网上售票口窗口---->卖出的车票号No.44
军人售票口窗口---->卖出的车票号No.43
网上售票口窗口---->卖出的车票号No.42
老年人售票口窗口---->卖出的车票号No.41
老年人售票口窗口---->卖出的车票号No.40
老年人售票口窗口---->卖出的车票号No.39
学生售票口窗口---->卖出的车票号No.38
老年人售票口窗口---->卖出的车票号No.37
网上售票口窗口---->卖出的车票号No.36
军人售票口窗口---->卖出的车票号No.35
网上售票口窗口---->卖出的车票号No.34
老年人售票口窗口---->卖出的车票号No.33
老年人售票口窗口---->卖出的车票号No.32
学生售票口窗口---->卖出的车票号No.31
老年人售票口窗口---->卖出的车票号No.30
网上售票口窗口---->卖出的车票号No.29
军人售票口窗口---->卖出的车票号No.28
网上售票口窗口---->卖出的车票号No.27
网上售票口窗口---->卖出的车票号No.26
网上售票口窗口---->卖出的车票号No.25
老年人售票口窗口---->卖出的车票号No.24
老年人售票口窗口---->卖出的车票号No.23
老年人售票口窗口---->卖出的车票号No.22
学生售票口窗口---->卖出的车票号No.21
老年人售票口窗口---->卖出的车票号No.20
网上售票口窗口---->卖出的车票号No.19
军人售票口窗口---->卖出的车票号No.18
网上售票口窗口---->卖出的车票号No.17
网上售票口窗口---->卖出的车票号No.16
老年人售票口窗口---->卖出的车票号No.15
老年人售票口窗口---->卖出的车票号No.14
学生售票口窗口---->卖出的车票号No.13
老年人售票口窗口---->卖出的车票号No.12
网上售票口窗口---->卖出的车票号No.11
军人售票口窗口---->卖出的车票号No.10
网上售票口窗口---->卖出的车票号No.9
老年人售票口窗口---->卖出的车票号No.8
学生售票口窗口---->卖出的车票号No.7
学生售票口窗口---->卖出的车票号No.6
学生售票口窗口---->卖出的车票号No.5
老年人售票口窗口---->卖出的车票号No.4
网上售票口窗口---->卖出的车票号No.3
军人售票口窗口---->卖出的车票号No.2
军人售票口窗口---->卖出的车票号No.1
网上售票口票已售罄!!!
老年人售票口票已售罄!!!
学生售票口票已售罄!!!

猜你喜欢

转载自blog.csdn.net/qq_36186690/article/details/82945117