模拟线程安全的售票案例(java)

Posted 即使如此

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟线程安全的售票案例(java)相关的知识,希望对你有一定的参考价值。

package try51.thread.safe;

import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockDemo {
    public static void main(String[] args) {
        // 所有票源
        ArrayList<Thread> lst = new ArrayList<>();
        lst.add(new Thread(new Tickets2("网上       售票")));
        lst.add(new Thread(new Tickets2("手机APP 售票")));
        lst.add(new Thread(new Tickets2("实地窗口售票")));

        // 随机产生一个客户端类型
        Random rdom = new Random();
        // 设置一个线程池
        ExecutorService es = Executors.newFixedThreadPool(100);
        // 模拟有 15个客户端 来购票
        for (int i = 0; i < 15; i++) {
            int index = rdom.nextInt(3);
            Thread thread = lst.get(index);
            // 购票线程进入线程池
            es.submit(thread);
        }
        // 关闭线程池
        es.shutdown();
    }
}

/**
 * 
 * @author lztkdr
 *
 */
class Tickets2 implements Runnable {

    // 安全锁对象
    public static Lock locker = new ReentrantLock();

    // 静态的票总数(固定)
    public static int TicketCount = 10;

    public String name;

    /**
     * 
     * @param name
     *            客户端 票源
     */
    public Tickets2(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        // 线程锁 队列式 售票
        locker.lock();
        try {
            // 模拟购票需要200毫秒
            Thread.sleep(200);
            if (TicketCount > 0) {
                System.out.println(this.name + "\\t出售1一张,剩余\\t " + (--TicketCount));
            } else {
                System.out.println(this.name + "\\t沒有抢到票!!!");
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            locker.unlock();
        }
    }
}

 

以上是关于模拟线程安全的售票案例(java)的主要内容,如果未能解决你的问题,请参考以下文章

java多线程——多线程的安全问题

java-利用多线程Runnable,公用一个参数问题

线程模拟售票问题

Java 多线程安全问题简单切入详细解析

java多线程(线程安全,线程同步)

多线程安全问题产生&解决方案