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多线程抢票龟兔赛跑的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南