漫画:多线程经典例子之一窗口售票

image

多线程经典例子:

1.生产与消费

2.多窗口售票

3.龟兔赛跑

4.银行取款

5.读者写者

6.多线程交替打印abc(顺序打印)

具体描述:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C要求, 同时启动三个线程, 按顺序输出ABC, 循环10次

7.描述:子线程循环10次,接着回到主线程循环100次,如次循环50次。

等等

image

直接上代码,如下(注意注释)

public class SellTickets {
        public static void main(String[] args) {
            Ticket ticket=new Ticket(10);
            new Thread(ticket,"窗口1").start();
            new Thread(ticket,"窗口2").start();
            new Thread(ticket,"窗口3").start();
        }
    }
    /**
     * 采用实现Runnable接口的方式实现多线程
     */
    class Ticket implements Runnable {
        //总的车票数
        int total;
        Object object = new Object();
        Ticket(int total){
            this.total=total;
        }
        //车票号
        int num = 1;
        @Override
        public void run() {
            while (true) {
                System.out.println(Thread.currentThread().getName()+" 等待同步锁");
                synchronized (object) {//线程持有同一个object对象
                    // 持有同步锁的窗口执行同步方法块等内容
                    // 而其余窗口等待该持有该同步锁的窗口释放object对象,
                    // 一旦方法块执行完,则开始重新分配锁给哪个窗口持有
                    System.out.println(Thread.currentThread().getName()+" 持有同步锁");                    try {
                        if (num > total) {
                            System.out.println("车票已经卖完啦!");
                            return;
                        }
                        // sleep并不释放同步锁,此处只是休眠100s,等休眠100s后执行后续代码
                        Thread.sleep(100);
                        System.out.println(Thread.currentThread().getName() + " 售出火车票 NO." + (num++));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
}

输出日志:

窗口1 等待同步锁
窗口3 等待同步锁
窗口2 等待同步锁
窗口1 持有同步锁
窗口1 售出火车票 NO.1
窗口1 等待同步锁
窗口2 持有同步锁
窗口2 售出火车票 NO.2
窗口2 等待同步锁
窗口2 持有同步锁
窗口2 售出火车票 NO.3
窗口2 等待同步锁
窗口3 持有同步锁
窗口3 售出火车票 NO.4
窗口3 等待同步锁
窗口2 持有同步锁
窗口2 售出火车票 NO.5
窗口2 等待同步锁
窗口1 持有同步锁
窗口1 售出火车票 NO.6
窗口1 等待同步锁
窗口2 持有同步锁
窗口2 售出火车票 NO.7
窗口2 等待同步锁
窗口3 持有同步锁
窗口3 售出火车票 NO.8
窗口3 等待同步锁
窗口3 持有同步锁
窗口3 售出火车票 NO.9
窗口3 等待同步锁
窗口2 持有同步锁
窗口2 售出火车票 NO.10
窗口2 等待同步锁
窗口2 持有同步锁
车票已经卖完啦!
窗口1 持有同步锁
车票已经卖完啦!
窗口3 持有同步锁
车票已经卖完啦!

今天的内容就是如此啦,举例的其他经典案例,就不再此篇幅讲了,

大家如果还有其他的经典例子,可以告知哦,谢谢!


本人公众号,会不定期更新!

感谢您的喜欢

请多多关注和支持!

❤️

程序员七猫

你可能感兴趣的:(漫画:多线程经典例子之一窗口售票)