3 回答

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");
}

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()
您的嘗試有幾個問題。
myThread
被錯誤命名。它返回的Runnable
不是Thread
.您沒有做任何事情來阻止
MyThread
實例的無限鏈創建。您實際上并沒有創建任何線程。如果仔細觀察
myThread()
,它會在創建任何線程之前(無限地)遞歸。myThread()
調用null
返回。如果它實際上被傳遞給了Thread(Runnable)
構造函數,你就會得到一個 NPE。

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;
}
添加回答
舉報