Java 學習記錄103 — Multiple Threads

張小雄
5 min readJan 13, 2022

--

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

上面代碼全都紀錄在我的 Github

--

--

張小雄
張小雄

Written by 張小雄

記錄成為軟體工程師的過程

No responses yet