我正在玩多線程,並在運行一小段代碼時遇到了不一致。下面的代碼應打印出123123 ...但我得到的是爲什麼線程不能一致運行?
class RunnableDemo implements Runnable {
private String message;
RunnableDemo(String m) {
message = m;
}
public void run() {
try {
for (int i = 0; i < message.length(); i++) {
System.out.print(message.charAt(i));
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class TestThread {
public static void main(String args[]) throws InterruptedException {
new Thread(new RunnableDemo("1111111")).start();
new Thread(new RunnableDemo("2222222")).start();
new Thread(new RunnableDemo("3333333")).start();
}
}
輸出:123231231132123231321
輸出:123213123123213213213
輸出:123231213213231231213
什麼我不明白的是它在第一次傳球(打印'123')時正確運行,但第二次傳球打印'231'。如果線程正在打印字符,睡眠1秒鐘,然後重複。不應該每次我運行代碼或至少按照前3個字符的模式來保持模式123123 ...一致?
他們是線程,你沒有安排他們,JVM/OS是。此外,股票Java不是實時的;睡眠計數和切換的微小差異會改變結果。 –
要添加到@DaveNewton的評論,您將不得不確保3個線程通過使用「同步」或鎖定一個接一個地執行 – TheLostMind
我可以將此問題轉換爲:「爲什麼當我讓東西並行運行時,不是按順序發生的?「 – Gimby