簡體   English   中英

Java-具有可運行性的線程未啟動

[英]Java - Thread with runnable not starting

我遇到了一些不想啟動的線程問題。 我有三節課。 主類:

public class Main {
    public static void main(String[] args) {
        T1 t1 = new T1();
        T2 t2 = new T2();
    }
}

Thread繼承的類:

public class T1 extends Thread {
    public T1() {run();}
    public void run() {
        while (true) {
            try {Thread.sleep(1000);}
            catch (InterruptedException e) {e.printStackTrace();}
            System.out.println("Thread 1");         
        }
    }
}

還有一個實現Runnable的類:

public class T2 implements Runnable {
    public T2() {new Thread(this).start();}
    public void run() {
        while (true) {
            try {Thread.sleep(1000);}
            catch (InterruptedException e) {e.printStackTrace();}
            System.out.println("Thread 2");
        }
    }
}

當我運行它時,我希望t1t2對象都每秒打印一次他們的消息,但是只有t1可以這樣做。 t2不打印任何內容。 但是,如果我交換訂單並在t1之前實例化t2 ,那么它們都將按預期開始打印。 為什么會這樣?

public T1() {run();}

您從未啟動過線程; 您只是直接調用了run() ,它將在原始線程中永遠運行。

使用start()方法啟動線程。 所以你的主看起來像

    T1 t1 = new T1();
    T2 t2 = new T2();
    t1.start();
    t2.start();

擺脫線程類中的構造函數。 他們不應該啟動線程。

問題: T1T2尚未作為線程啟動。 由於您直接調用了run()方法而不是start()方法,因此無法正常工作。

一旦創建了t1對象,就在構造函數中調用run()方法,該方法又在無限while循環中調用sleep() 根本沒有調用創建t2對象的下一條語句。

修復:刪除T1 and T2 classes constructorsrun()調用,並在這兩個線程上調用start()

T1構造函數中,從

 public T1() {run();}

public T1() {}

T2()構造函數也是如此。 如上所述刪除run()方法。

將主要方法從

public static void main(String[] args) {
    T1 t1 = new T1();
    T2 t2 = new T2();
}

public static void main(String[] args) {
    T1 t1 = new T1();
    t1.start();
    T2 t2 = new T2();
    t2.start();
}

閱讀有關如何啟動線程的oracle 文檔 run()方法應該由Java虛擬機而不是代碼調用。 您只需要調用start()方法,然后依次調用run()方法

public void start()

使該線程開始執行; Java虛擬機將調用此線程的run方法。

暫無
暫無

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

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