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();
}
}
标签:线程,Java,Thread,抢票,---,steps,new,多线程,public 来源: https://www.cnblogs.com/JunkingBoy/p/14838849.html