再写多线程卖票实例

分享成果,欢迎指正。

package com.gannalyo.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// /**
// * 经典多线程卖票
// *
// * 1.共20张票
// * 2.共5个窗口同时售票
// * 3.由于多个窗口操作的都是卖票,所以仅实现一个任务即可
// * 任务中通过while循环不断卖票,直到卖完为止,卖票操作同一时间只能被一个线程操作,故需加同步关键字,
// * 4.开启5个线程同时执行卖票任务
// *
// * @author Gannalyo
// */
public class 多线程卖票002 {

    private static int ticketCount = 20;// 共20张票
    private static int windowCount = 5;// 共5个窗口同时售票
    
    private 多线程卖票002() {}

    static class SaleTicketTask implements Runnable {
        public void run() {
            while (ticketCount > 0) {// 只要有票就持续卖票
                // 多个线程可同时进入到此行
                synchronized (SaleTicketTask.class) {// 加同步关键字,是限制同一时间只能一个窗口进行卖票,注意此处的锁(个人习惯使用类.class,因为唯一)
                    if (ticketCount > 0) {// 当同时进入while循环的线程数多于剩余票数时,若不加此判断,将会出现0或负数票号
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                        }
                        System.out.println("窗口[ " + Thread.currentThread().getName() + " ]卖出[ " + ticketCount + " ]号票。");
                        ticketCount--;
                        if (ticketCount == 0) {
                            System.err.println("票已售完。");
                        }
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        SaleTicketTask saleTicketTask = new SaleTicketTask();
        ExecutorService executorService = Executors.newFixedThreadPool(windowCount);
        for (int i = 0; i < windowCount; i++) {
            executorService.execute(saleTicketTask);
        }
        executorService.shutdown();
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值