簡體   English   中英

無法理解線程-可運行接口的工作

[英]Unable to understand the working of Threads- Runnable Interface

public class Test {
    private static void funct(final int i) {
        new Thread(new Runnable() {
            public void run() {System.out.println(i);}
         }).start(); 
    }
    public static void main(String[] args) {
        System.out.println(1);
        funct (2);
        System.out.println(3);
        funct (4);
        System.out.println(5);
    }
}

每次運行它,我都會得到以下解決方案之一。 為什么這樣? 1 3 5 4 2

1 3 5 2 4

1 3 2 5 4

在此示例中,數字的打印順序不確定。 您唯一可以確定的是,1、3和5將按該順序出現。 但是,這種排列2和4的位置尚不明確。 原因是您有3個線程打印出以下數字系列:(1、3、5); (2)和(4)。 這三個線程將由JVM調度,但是它確定最好。

多線程編程是一個復雜的主題,由於您似乎剛剛開始涉足,因此我建議使用Oracle Java教程的Concurrency部分: http : //download.oracle.com/javase/tutorial/essential/concurrency/index .html

這是因為您無法控制首先生成哪個線程。 它由JVM決定。 因為它們是從main執行的,所以只有“ 1、3、5”是有順序的。

這個問題可能是相關的:

  1. 在特定時間運行Java線程

因為您的主線程有時會擊敗其他兩個線程。 其他時候沒有。

您有三個線程; 無法保證將按計划以任何特定順序運行。

線程和異步性通常是復雜的主題,但是簡短的是,在您的情況下,線程需要一點時間來加速,因此它們根據JVM的處理器時間類型與其他打印語句交錯(並且,然后,操作系統決定分配給那些線程。

我強烈建議Brian Goetz等人撰寫的《 Java Concurrency in Practice 》一書,如果您想真正掌握正在發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM