【狂神说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();
}
}

浙公网安备 33010602011771号