1. 程式人生 > 實用技巧 >執行緒併發問題及龜兔賽跑延時典例

執行緒併發問題及龜兔賽跑延時典例

執行緒併發問題及龜兔賽跑延時典例

併發問題

package com.xxgc.demo01;

//多個執行緒同時操作同一個物件
//買火車票的例子
//發現併發問題:多個執行緒操作同一個資源的情況下,執行緒不安全,資料紊亂.
//例如:不同的人買到同一張票,或者第0張票
public class TestThread4 implements Runnable {
private int ticketNums = 10;

@Override
public void run() {
while (true){
if(ticketNums<=0){
break;
}
//模擬延時
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums--+"張票");
}
}

public static void main(String[] args) {
TestThread4 ticket = new TestThread4();

new Thread(ticket,"小明").start();
new Thread(ticket,"老師").start();
new Thread(ticket,"黃牛").start();
}
}

龜兔賽跑-->延時處理

package com.xxgc.demo01;

//模擬龜兔賽跑
public class Race implements Runnable {
//勝利者
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
//模擬兔子睡覺
if(Thread.currentThread().getName().equals("兔子")&& i%10==0){
try {
//兔子每10步休息1毫秒
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判斷比賽是否結束
boolean flag = gameOver(i);
//如果比賽結束了,就停止程式
if (flag){
break;
}
System.out.println(Thread.currentThread().getName()+"--->跑了"+i+"步");
}
}
//判斷是否完成比賽
private boolean gameOver(int steps){ //int steps //步數
//判斷是否有勝利者
if(winner!=null){ //已經存在勝利者了
return true;
}
if(steps==100) {
winner = Thread.currentThread().getName();
System.out.println("winner is " + winner);
return true;
}
return false;
}

public static void main(String[] args) {
Race race = new Race();
new Thread(race,"兔子").start();
new Thread(race,"烏龜").start();
}
}