[英]Java: Start Thread (Alternative to starting in constructor)
是否有另一種方法來在創建對象時啟動線程(當調用構造函數時)。 我知道你無法在構造函數中啟動線程。 但是如果我在類中有兩個方法(類稱為Tasks),它實現了Runnable:run(),continuousRecv()。 run()方法調用continuousRecv()函數。 continuousRecv()做了一些事情。 然后我在公共類Tasks中創建一個名為startContRecv()的私有類,並在構造函數調用中啟動該線程,就像這樣
Thread t1 = new Thread(new Tasks());
t1.start();
我的代碼:
import java.lang.Runnable;
public class Tasks implements Runnable {
public Tasks() {
startContinousReceive conRecv = new startContinousReceive();
}
public void continuiousReceive() {
while (true) {
//Code to executed
}
}
public void run() {
continuiousReceive();
}
//PRIVATE CLASS WHICH STARTS THREAD
//INSTANCE OF PRIVATE CLASS IS MADE IN CONSTRUCTOR OF TASKS CLASS
private class startContinousReceive {
public startContinousReceive() {
Thread t1 = new Thread(new Tasks());
t1.start();
}
}
}
您將獲得一個無限循環的實例化Tasks對象,這些對象最終會出現在OutOfMemoryError中。 實例化任務的object1,然后實例化你的私有類,再次實例化任務的另一個對象2,循環重新開始。
實現所需的最簡單方法:創建任務時也啟動一個線程,就是在Tasks類中定義一個工廠方法,並將Tasks構造函數設為私有。 見下文:
public static void createTask( ) {
Tasks t = new tTasks();
Thread t = new Thread( t) ;
t.start( );
}
並聲明您的構造函數是私有的,以確保Task實例化的唯一方法是通過此工廠方法。 否則你也不會得到線程啟動。 此外,您應該刪除內部私有類,在這種情況下是無用的。
在構造函數中做很多工作是反模式 。
特別是,它破壞了構造函數的子類化能力。
所以不要嘗試在構造函數中啟動線程!
為什么代碼就像
new MyThread().start();
壞? 它非常易讀:創建一個新線程並運行它。
如果需要,您仍然可以將其包裝在一個方法中:
public void startNewThread() {
new MyThread().start();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.