[英]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");
}
}
}
當我運行它時,我希望t1
和t2
對象都每秒打印一次他們的消息,但是只有t1
可以這樣做。 t2
不打印任何內容。 但是,如果我交換訂單並在t1
之前實例化t2
,那么它們都將按預期開始打印。 為什么會這樣?
public T1() {run();}
您從未啟動過線程; 您只是直接調用了run()
,它將在原始線程中永遠運行。
使用start()方法啟動線程。 所以你的主看起來像
T1 t1 = new T1();
T2 t2 = new T2();
t1.start();
t2.start();
擺脫線程類中的構造函數。 他們不應該啟動線程。
問題: T1
和T2
尚未作為線程啟動。 由於您直接調用了run()方法而不是start()方法,因此無法正常工作。
一旦創建了t1對象,就在構造函數中調用run()
方法,該方法又在無限while
循環中調用sleep()
。 根本沒有調用創建t2對象的下一條語句。
修復:刪除T1 and T2 classes
constructors
的run()
調用,並在這兩個線程上調用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.