MultipleThreads.java
import thread.ThreadColor;public class MultipleThreads {
public static void main(String[] args) { Countdown countdown = new Countdown(); CountdownThread t1 = new CountdownThread(countdown);
t1.setName("Thread 1");
CountdownThread t2 = new CountdownThread(countdown);
t2.setName("Thread 2"); t1.start();
t2.start(); }
}class Countdown {
public void doCountdown() {
String color; switch (Thread.currentThread().getName()) {
case "Thread 1":
color = ThreadColor.ANSI_CYAN;
break;
case "Thread 2":
color = ThreadColor.ANSI_PURPLE;
break;
default:
color = ThreadColor.ANSI_GREEN;
}
for (int i = 10; i > 0; i--) {
System.out.println(color + Thread.currentThread().getName() + ": i=" + i);
}
}
}class CountdownThread extends Thread {
private Countdown threadCountdown; public CountdownThread(Countdown countdown) {
this.threadCountdown = countdown;
} @Override
public void run() {
threadCountdown.doCountdown();
}
}
輸出結果 1:
Thread 1: i=10
Thread 2: i=10
Thread 1: i=9
Thread 2: i=9
Thread 1: i=8
Thread 2: i=8
Thread 1: i=7
Thread 2: i=7
Thread 1: i=6
Thread 2: i=6
Thread 1: i=5
Thread 2: i=5
Thread 1: i=4
Thread 2: i=4
Thread 1: i=3
Thread 2: i=3
Thread 1: i=2
Thread 2: i=2
Thread 1: i=1
Thread 2: i=1
輸出結果 2:
Thread 2: i=10
Thread 2: i=9
Thread 2: i=8
Thread 2: i=7
Thread 2: i=6
Thread 2: i=5
Thread 2: i=4
Thread 2: i=3
Thread 2: i=2
Thread 2: i=1
Thread 1: i=10
Thread 1: i=9
Thread 1: i=8
Thread 1: i=7
Thread 1: i=6
Thread 1: i=5
Thread 1: i=4
Thread 1: i=3
Thread 1: i=2
Thread 1: i=1
做了兩個 Thread,功能是各自從 10 數到 1
在 Intellij 上執行會有顏色區分
我一開始執行,發現顏色都只出現 default
那邊設的,沒有出現其他顏色
一直很納悶到底哪裡寫錯,開了比對 code 才發現自己忘記在 case
那邊加上 break
此外,可以看到兩次執行結果不同
跟之前 Tim 提醒的一樣,Thread 每次執行結果都有可能不同
我這邊出現過至少三種不同的結果
修改 Countdown
class Countdown {
private int i;
public void doCountdown() {
String color; switch (Thread.currentThread().getName()) {
case "Thread 1":
color = ThreadColor.ANSI_CYAN;
break;
case "Thread 2":
color = ThreadColor.ANSI_PURPLE;
break;
default:
color = ThreadColor.ANSI_GREEN;
}
for (i = 10; i > 0; i--) {
System.out.println(color + Thread.currentThread().getName() + ": i=" + i);
}
}
}
輸出結果:
Thread 2: i=10
Thread 2: i=9
Thread 2: i=8
Thread 2: i=7
Thread 2: i=6
Thread 2: i=5
Thread 2: i=4
Thread 2: i=3
Thread 2: i=2
Thread 2: i=1
Thread 1: i=10
把 for
裡面的變量 i
改成 class
裡的變量
結果變成不是各自輸出10次
而是兩個 Thread 總共輸出10次
而且還輸出了兩次 i
= 10
Tim 說這是因為 class
裡面的變量 i
是共用的,兩個Thread 都能對其修改
這種情況稱作為 Thread Interference
每次重新執行的結果,差異可以到非常大,而且也是無法預測
補充資料:Thread Interference