我想在具有相同主体的线程内启动线程。创建新线程后,我想绕过启动新线程的行,并运行其余代码。
以下代码是我的失败实现。我希望输出中有“返回”。实际上,仅打印“开始”。我该如何解决?
预先感谢您的帮助!
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;
}
答案 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
的其他变量,则必须适当使用volatile
或synchronized
。这不适用于我使用launchedSubthread
的方式。这是因为在新启动的线程上的start()
调用和run()
调用之间有一个发生。
您的尝试遇到了一些问题。
myThread
的名称错误。它返回的是Runnable
而不是Thread
。
您并没有采取任何措施来阻止MyThread
实例的无限创建。
您实际上并没有创建任何线程。如果您仔细查看myThread()
,它会无限循环递归,然后再创建任何线程。
myThread()
调用返回null
。如果确实将其传递给Thread(Runnable)
构造函数,则将获得一个NPE。