java之多线程抢火车票的实现示例

 更新时间:2024年02月03日 09:32:24   作者:帅龍之龍  
生活中有很多多线程的案例,购票就是一个很常见的问题,本文主要介绍了java之多线程抢火车票的实现示例,具有一定的参考价值,感兴趣的可以了解一下

一、创建线程的方法是实现runnable,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法

*********************************/
//多个线程同时操作一个类
    //火车票
public class TestTread4 implements Runnable{

    //票数
   private int ticketNums = 10;
    @Override
    public void run() {

        while (true) {
            if (ticketNums <= 0) {
                break;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums-- +"张票");
        }

    }

    public static void main(String[] args) {
        TestTread4 testTread4 = new TestTread4();

        new Thread(testTread4, "小明").start();
        new Thread(testTread4,"老师").start();
        new Thread(testTread4,"黄牛").start();
    }
}

发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱.

加上锁就搞定

public class TestTread4 implements Runnable{

    //票数
   private int ticketNums = 10;
    @Override
    public synchronized void run() {

        while (true) {
            if (ticketNums <= 0) {
                break;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums-- +"张票");
        }

    }

    public static void main(String[] args) {
        TestTread4 testTread4 = new TestTread4();

        new Thread(testTread4, "小明").start();
        new Thread(testTread4,"老师").start();
        new Thread(testTread4,"黄牛").start();
    }
}

当有200人抢100张票

public class TicketRunnable implements Runnable {

    /**
     * 总票数
     */
    private final int ticketSize = 100;

    /**
     * 抢票人数
     */
    private final int peopleSize = 200;

    /**
     * 票数
     */
    private int ticketNum;

    /**
     * 人数
     */
    private int peopleNum;

    @Override
    public void run() {
        while(ticketNum < ticketSize && peopleNum < peopleSize){
            synchronized (this){
                if(ticketNum < ticketSize && peopleNum < peopleSize){
                    if((int)(Math.random() * 20) % 2 == 1){
                        System.out.println(Thread.currentThread().getName() + "第" + (++peopleNum) + "个人抢到第" + (++ticketNum) + " 张票");
                    try {
                        Thread.sleep(100);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    }else {
                        System.out.println(Thread.currentThread().getName() + "第" + (++peopleNum) + " 个人未抢到票");
                    }
                }
            }
        }

    }
}
public class TestTicket {
    public static void main(String[] args) {
        TicketRunnable tr = new TicketRunnable();
        Thread t1 = new Thread(tr , "窗口A");
        Thread t2 = new Thread(tr , "窗口B");
        Thread t3 = new Thread(tr , "窗口C");
        Thread t4 = new Thread(tr , "窗口D");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

到此这篇关于java之多线程抢火车票的实现示例的文章就介绍到这了,更多相关java 多线程抢火车票内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java实现多线程断点下载实例代码(下载过程中可以暂停)

    Java实现多线程断点下载实例代码(下载过程中可以暂停)

    线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道,Java实现多线程断点下载实例代码(下载过程中可以暂停),有兴趣的可以了解一下。
    2016-12-12
  • JDBC 使用说明(流程、架构、编程)

    JDBC 使用说明(流程、架构、编程)

    这篇文章主要介绍了JDBC 使用说明,需要的朋友可以参考下
    2015-08-08
  • 详解springboot读取yml配置的几种方式

    详解springboot读取yml配置的几种方式

    这篇文章主要介绍了详解springboot读取yml配置的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java中数组复制的三种方式小结

    Java中数组复制的三种方式小结

    在Java中,数组复制是一种常见的操作,它允许开发人员在不修改原始数组的情况下创建一个新的数组,本文就来介绍三种方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • java导出Excel通用方法实例

    java导出Excel通用方法实例

    这篇文章主要介绍了java导出Excel方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Java Mybatis框架由浅入深全解析下篇

    Java Mybatis框架由浅入深全解析下篇

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码,本文将作为最终篇为大家介绍MyBatis的使用
    2022-07-07
  • Java观察者模式之实现对象间的一对多依赖

    Java观察者模式之实现对象间的一对多依赖

    这篇文章主要介绍了Java观察者模式之实现对象间的一对多依赖的方法,Java观察者模式是一种行为型设计模式,用于实现对象之间的消息传递和通信,文中有详细的实现步骤和代码示例,,需要的朋友可以参考下
    2023-05-05
  • java中ConcurrentHashMap的读操作为什么不需要加锁

    java中ConcurrentHashMap的读操作为什么不需要加锁

    ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁。所以下面这篇文章主要给大家介绍了关于java中ConcurrentHashMap的读操作为什么不需要加锁的相关资料,需要的朋友可以参考下
    2018-10-10
  • Java模拟实现斗地主的洗牌和发牌

    Java模拟实现斗地主的洗牌和发牌

    这篇文章主要为大家详细介绍了Java模拟实现斗地主的洗牌和发牌,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Springboot整合RabbitMQ消息中间件的使用

    Springboot整合RabbitMQ消息中间件的使用

    在没有特别要求的情况下,通常会选择RabbitMQ作为消息中间件,本文主要介绍了Springboot整合RabbitMQ消息中间件的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11

最新评论