【狂神说Java】并发问题、龟兔赛跑

并发问题

-> 问题处理

public class MoreTreads implements Runnable{
    // 多线程同时操作同一个对象
    // 买火车票的例子
    private int ticketNums = 10;

    @Override
    public void run() {
        while(true){
            if(ticketNums<=0){
                break;
            }
            // 模拟延时
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 获取当前线程名字Thread.currentThread().getName()
            System.out.println(Thread.currentThread().getName()+"第"+(ticketNums--)+"张票");
        }
    }

    public static void main(String[] args) {
        MoreTreads moreTreads = new MoreTreads();
        // 匿名
        new Thread(moreTreads,"A").start();
        new Thread(moreTreads,"B").start();
        new Thread(moreTreads,"C").start();
    }
}

多线程同时操作同一个对象存在问题,数据紊乱,线程不安全,如图:

龟兔赛跑

打印进度条,/r回到开头

System.out.print("=/r");
System.out.print("====/r");

龟兔赛跑代码

public class Race implements Runnable{
    private static String winner;
    private static int distance;

    public Race(int num) {
        this.distance = num;
    }

    @Override
    public void run() {
        for (int i = 0; i < distance; i++) {
            if (gameOver()){
                break;  // 判断有没有到终点
            }
            position(i); // 打印当前位置
            try {
                Thread.sleep(10); // 兔子速度 ,走一步停 10
                if(Thread.currentThread().getName() == "龟"){
                    Thread.sleep(90);  // 乌龟速度,走一步停 10+90
                }
                if (Thread.currentThread().getName() == "兔" && i == distance/2){
                    Thread.sleep(distance * 90 + 1);  // 兔子在一半路程会睡觉
                    // 50*10 = 500 兔子赢,乌龟才走了5步,让乌龟赢要让乌龟在所有时间走45步,也就是让兔子等45*100ms以上
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    private boolean gameOver(){
        // 判断有没有胜利者
        if (winner!=null){
            return true;
        }
        return false;
    }


    public void position(int num){
        // 位于赛道位置
        for (int i = 0; i < num; i++) {
            System.out.print("=");
        }

        // 获取线程名字
        System.out.print(Thread.currentThread().getName()+"\r");
        if (num == distance-1){
            System.out.println(Thread.currentThread().getName()+"胜利");
            winner = Thread.currentThread().getName();
        }
    }

    public static void main(String[] args) {
        Race race = new Race(50);// 在同一个赛道跑,同一个对象
        new Thread(race,"兔").start();
        new Thread(race,"龟").start();
    }
}
posted @ 2021-09-15 10:43  Jie7  阅读(86)  评论(0)    收藏  举报