亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在具有相同主體的線程中啟動新線程?

如何在具有相同主體的線程中啟動新線程?

慕虎7371278 2022-12-15 10:55:58
我想在具有相同主體的線程中啟動一個線程。創建新線程后,我想繞過啟動新線程的行并運行其余代碼。以下代碼是我的失敗實現。我希望輸出中有“返回”。實際上,只打印了“start”。我怎樣才能解決這個問題?在此先感謝您的幫助!public static void main(String[] args) throws InterruptedException{    System.out.println("start");    new Thread(myThread()).start();    System.out.println("return");    return;}private static Runnable myThread() throws InterruptedException{    System.out.println("start");    Thread.sleep(1000);    new Thread(myThread()).start();    System.out.println("return");    return null;}
查看完整描述

3 回答

?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

首先,要創建一個 thead,您將一個 runnable 傳遞給構造函數。您所做的是嘗試將myThread()返回的值傳遞給它,而不是方法引用。


(不要)試試這個:(它可能會導致系統崩潰,因為它會產生無限數量的線程)


public static void main(String[] args) throws InterruptedException{

    System.out.println("start");

    new Thread(() -> myThread()).start(); // Added () -> 

    System.out.println("return");

}


private static void myThread() throws InterruptedException{

    System.out.println("start");

    Thread.sleep(1000);

    new Thread(() -> myThread()).start(); // Added () -> 

    System.out.println("return");

}

我也讓它返回void,因為此時返回 null 毫無意義。


然后,正如所指出的,您需要限制創建的線程數量。例如,如果你想要兩個線程:


private static final int numThreads = 0; // added


public static void main(String[] args) throws InterruptedException{

    System.out.println("start");

    new Thread(() -> myThread()).start();

    System.out.println("return");

}


private static void myThread() throws InterruptedException{

    System.out.println("start");

    Thread.sleep(1000);

    if (++numThreads < 2) // added

        new Thread(() -> myThread()).start();


    System.out.println("return");

}


查看完整回答
反對 回復 2022-12-15
?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

我想在具有相同主體的線程中啟動一個線程。創建新線程后,我想繞過啟動新線程的行并運行其余代碼。


是這樣的:


public class Test {

    public class Worker extends Runnable {

        private boolean launchedSubthread = false;


        public void run() {

            if (!launchedSubthread) {

                launchedSubthread = true;

                new Thread(this).start();

            }

            // Now do some stuff.

        }

    }


    public void main(String[] args) {

        new Thread(new Worker()).start();

    }

}

請注意,當我們啟動類中的第二個子線程時Worker,我們將this作為Runnable. 所以這兩個子線程將共享一個Worker實例作為它們的“主體”。(我假設這就是你想要做的。)


在你想讓兩個線程讀取或更新 的其他變量Worker,那么你必須適當地使用volatileor synchronized。這不適用于我使用的方式launchedSubthread。這是因為在調用和新啟動的線程上的調用之間發生了happens before 。start()run()

您的嘗試有幾個問題。

  1. myThread被錯誤命名。它返回的Runnable不是Thread.

  2. 您沒有做任何事情來阻止MyThread實例的無限鏈創建。

  3. 您實際上并沒有創建任何線程。如果仔細觀察myThread(),它會在創建任何線程之前(無限地)遞歸。

  4. myThread()調用null返回。如果它實際上被傳遞給了Thread(Runnable)構造函數,你就會得到一個 NPE。


查看完整回答
反對 回復 2022-12-15
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

嘗試這個 :


public static void main(String[] args) throws InterruptedException{

    System.out.println("start");

    new Thread(myThread()).start();

    System.out.println("return");

    return;

}


static boolean threadStared = false;


private static Runnable myThread() throws InterruptedException{

    System.out.println("start");

    Thread.sleep(1000);

    if(!threadStared){

        new Thread(myThread()).start();

        threadStared = true;

    }

    System.out.println("return");

    return null;

}


查看完整回答
反對 回復 2022-12-15
  • 3 回答
  • 0 關注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號