为了账号安全,请及时绑定邮箱和手机立即绑定

如何在具有相同主体的线程中启动新线程?

如何在具有相同主体的线程中启动新线程?

慕虎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 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信