java 多線程練習,兩種方式的買票

package com.qcby.lock;

/**
 * @author HuangHaiyang
 * @date 2020/07/02
 * @description: description
 * @version: 1.0.0
 */
public class JucTest {
    public static void main(String[] args) {
        Ticket ticket=new Ticket();
        new Thread(()->{
            for (int i = 0; i <40 ; i++) {
                ticket.sell();
            } },"一號").start();
        new Thread(()->{
            for (int i = 0; i <40 ; i++) {
            ticket.sell();
        } },"二號").start();
        new Thread(()->{
            for (int i = 0; i <40 ; i++) {
            ticket.sell();
        }},"三號").start();
    }

    static class Ticket{
        private int number=30;

        private synchronized void sell(){
            if(number>0){
                System.out.println(Thread.currentThread().getName()+"窗口賣出了第"+number+"張票"+"剩餘"+--number+"張票");
            }
        }
    }
    //一號窗口賣出了第30張票剩餘29張票
    //一號窗口賣出了第29張票剩餘28張票
    //一號窗口賣出了第28張票剩餘27張票
    //二號窗口賣出了第27張票剩餘26張票
    //二號窗口賣出了第26張票剩餘25張票
    //二號窗口賣出了第25張票剩餘24張票
    //二號窗口賣出了第24張票剩餘23張票
    //二號窗口賣出了第23張票剩餘22張票
    //二號窗口賣出了第22張票剩餘21張票
    //二號窗口賣出了第21張票剩餘20張票
    //二號窗口賣出了第20張票剩餘19張票
    //二號窗口賣出了第19張票剩餘18張票
    //二號窗口賣出了第18張票剩餘17張票
    //二號窗口賣出了第17張票剩餘16張票
    //二號窗口賣出了第16張票剩餘15張票
    //二號窗口賣出了第15張票剩餘14張票
    //二號窗口賣出了第14張票剩餘13張票
    //二號窗口賣出了第13張票剩餘12張票
    //二號窗口賣出了第12張票剩餘11張票
    //二號窗口賣出了第11張票剩餘10張票
    //二號窗口賣出了第10張票剩餘9張票
    //二號窗口賣出了第9張票剩餘8張票
    //二號窗口賣出了第8張票剩餘7張票
    //二號窗口賣出了第7張票剩餘6張票
    //二號窗口賣出了第6張票剩餘5張票
    //二號窗口賣出了第5張票剩餘4張票
    //二號窗口賣出了第4張票剩餘3張票
    //二號窗口賣出了第3張票剩餘2張票
    //二號窗口賣出了第2張票剩餘1張票
    //二號窗口賣出了第1張票剩餘0張票
    //
    //Process finished with exit code 0
}


lock鎖

package com.qcby.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author HuangHaiyang
 * @date 2020/07/02
 * @description: description
 * @version: 1.0.0
 */
public class JucTest {
    public static void main(String[] args) {
        Ticket ticket=new Ticket();
        new Thread(()->{
            for (int i = 0; i <40 ; i++) {
                ticket.sell();
            } },"一號").start();
        new Thread(()->{
            for (int i = 0; i <40 ; i++) {
            ticket.sell();
        } },"二號").start();
        new Thread(()->{
            for (int i = 0; i <40 ; i++) {
            ticket.sell();
        }},"三號").start();
    }

    static class Ticket{
        private int number=30;

        private Lock lock=new ReentrantLock();
        private  void sell(){
            lock.lock();
            try {
                if(number>0){
                    System.out.println(Thread.currentThread().getName()+"窗口賣出了第"+number+"張票"+"剩餘"+--number+"張票");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
    //一號窗口賣出了第30張票剩餘29張票
    //一號窗口賣出了第29張票剩餘28張票
    //一號窗口賣出了第28張票剩餘27張票
    //一號窗口賣出了第27張票剩餘26張票
    //三號窗口賣出了第26張票剩餘25張票
    //三號窗口賣出了第25張票剩餘24張票
    //三號窗口賣出了第24張票剩餘23張票
    //二號窗口賣出了第23張票剩餘22張票
    //二號窗口賣出了第22張票剩餘21張票
    //二號窗口賣出了第21張票剩餘20張票
    //二號窗口賣出了第20張票剩餘19張票
    //二號窗口賣出了第19張票剩餘18張票
    //二號窗口賣出了第18張票剩餘17張票
    //二號窗口賣出了第17張票剩餘16張票
    //二號窗口賣出了第16張票剩餘15張票
    //二號窗口賣出了第15張票剩餘14張票
    //二號窗口賣出了第14張票剩餘13張票
    //二號窗口賣出了第13張票剩餘12張票
    //二號窗口賣出了第12張票剩餘11張票
    //二號窗口賣出了第11張票剩餘10張票
    //二號窗口賣出了第10張票剩餘9張票
    //二號窗口賣出了第9張票剩餘8張票
    //二號窗口賣出了第8張票剩餘7張票
    //二號窗口賣出了第7張票剩餘6張票
    //二號窗口賣出了第6張票剩餘5張票
    //二號窗口賣出了第5張票剩餘4張票
    //二號窗口賣出了第4張票剩餘3張票
    //二號窗口賣出了第3張票剩餘2張票
    //二號窗口賣出了第2張票剩餘1張票
    //二號窗口賣出了第1張票剩餘0張票
    //
    //Process finished with exit code 0

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章