6.1Java多线程抢票龟兔赛跑

2021/6/1 22:23:48

本文主要是介绍6.1Java多线程抢票龟兔赛跑,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

6.1Java多线程抢票龟兔赛跑

多线程抢票,并发问题,数据安全异常

package iostudy.thread;
​
/**
 * 共享资源
 * 一份资源,三个代理商
 * 当一份资源有多个代理去操作的时候就会存在并发问题
 * 并发发生之后后期需要保证线程安全
 * @since JDK 1.8
 * @date 2021/6/1
 * @author Lucifer
 */
public class Web12306 implements Runnable{
​
    /*资源数量*/
    private int ticketNum = 99;
​
    /*重写run方法*/
    @Override
    public void run(){
        /*死循环拿资源*/
        while (true){
            /*判断*/
            if (ticketNum < 0){
                /*循环终止*/
                break;
            }
            /*模拟网络延迟*/
            //因为run方法不能对外抛出异常且无返回值,所以使用try...catch捕获异常
            try {
                Thread.sleep(200);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "--->" +ticketNum--); //在输出层面关注是哪一个代理人获取到的资源--->使用Thread类里面的方法
            /*
            同一线程体有多个线程的时候做区分的
            这样操作就是并发了,会出现数据的不安全
             */
        }
    }
​
    public static void main(String[] args) {
​
        /*一份资源*/
        Web12306 web = new Web12306();
​
        /*打印main方法*/
        System.out.println(Thread.currentThread().getName());
​
        //三个代理人
        new Thread(web, "南博万").start(); //在构造器给标识,区分是哪一个代理人拿到的资源
        new Thread(web, "南博兔").start();
        new Thread(web, "南博斯瑞").start();
    }
}

这个写法会存在一个问题--->数据安全问题

多线程模拟比赛

package iostudy.thread;
​
/**
 * 模拟龟兔赛跑
 * 1、实现类写具体的实现方法--->循环、判断
 * 2、具体方法工具类写判断方法--->供线程调用
 * @since JDK 1.8
 * @date 2021/6/1
 * @author Lucifer
 */
public class Racer implements Runnable{
    /*
    1、这是具体的实现类,里面定义了具体的属性
    2、重写了Runnable里面的run方法,该方法定义了具体的实现方式
    3、判断方法新写一个方法去调用
    */
    private static String winner; //定义胜利者
    @Override
    public void run(){
        for (int steps = 0; steps <= 100; steps++){
            /*模拟兔子休息*/
            if (Thread.currentThread().getName().equals("rabbit") && steps%25==0){
                /*每走25步休息一次*/
                try {
                    /*线程休眠--->静态方法*/
                    Thread.sleep(100);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            /*输出是谁达到了一百步*/
            System.out.println(Thread.currentThread().getName() + "--->" + steps);
            /*每运行一次判断比赛是否结束*/
            boolean flag = gameOver(steps);
            /*如果flag的值是真*/
            if (flag == true){
                /*停止循环*/
                break;
            }
        }
    }
​
    /**
     * 胜利条件判断的方法
     * @param steps     步数
     * @return
     */
    public boolean gameOver(int steps){
        if (winner!=null){
            /*存在胜利者,返回真*/
            return true;
        }else {
            /*先到达一百步的人*/
            if (steps == 100){
                /*获得胜利者的名字*/
                winner = Thread.currentThread().getName();
                /*输出*/
                System.out.println("Winner is:" + winner);
                /*返回真*/
                return true;
            }
        }
        return false;
    }
​
    public static void main(String[] args) {
        /*一份资源,两个代理人*/
        Racer racer = new Racer();
        /*两个代理人,共享资源*/
        new Thread(racer, "tortoise").start();
        new Thread(racer, "rabbit").start();
    }
}

 



这篇关于6.1Java多线程抢票龟兔赛跑的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程