阅读背景:

再写多线程卖票实例

来源:互联网 

分享成果,欢迎指正。

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();
    }
}package com.gannalyo.thread;

i



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: