簡體   English   中英

Java:啟動線程(在構造函數中啟動的替代方法)

[英]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.

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