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

时间:2019-05-25 08:53:18

标签: java multithreading

我想在具有相同主体的线程内启动线程。创建新线程后,我想绕过启动新线程的行,并运行其余代码。

以下代码是我的失败实现。我希望输出中有“返回”。实际上,仅打印“开始”。我该如何解决?

预先感谢您的帮助!

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 个答案:

答案 0 :(得分:1)

首先,要创建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");
}

答案 1 :(得分:0)

尝试一下:

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

答案 2 :(得分:0)

  

我想在具有相同主体的线程内启动线程。创建新线程后,我想绕过启动新线程的行,并运行其余代码。

类似这样的东西:

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的其他变量,则必须适当使用volatilesynchronized。这不适用于我使用launchedSubthread的方式。这是因为在新启动的线程上的start()调用和run()调用之间有一个发生


您的尝试遇到了一些问题。

  1. myThread的名称错误。它返回的是Runnable而不是Thread

  2. 您并没有采取任何措施来阻止MyThread实例的无限创建。

  3. 您实际上并没有创建任何线程。如果您仔细查看myThread(),它会无限循环递归,然后再创建任何线程。

  4. myThread()调用返回null。如果确实将其传递给Thread(Runnable)构造函数,则将获得一个NPE。