如何让主流程最后结束?
例如,我编写了一些代码,创建了一个Thread: Test ,创建了另外三个线程 - Test2 ,但是在 Test 之前完成了>开始了。
public class Test implements Runnable{
String url;
Thread mThread;
public Test(String url) {
this.url = url;
}
public void start(){
this.mThread = new Thread(this);
this.mThread.start();
}
@Override
public void run() {
System.out.println("TEST STARTED!");
Test2 wclw[] = new Test2[3];
for (int i = 0; i < wclw.length; i++) {
wclw[i] = new Test2(url, i + 1);
wclw[i].start();
}
}
public static void main(String[] args) throws IOException {
System.out.println("MAin STARTED!");
(new Test("qwerty")).start();
System.out.println("MAIN FINISHED");
}
}
class Test2 implements Runnable{
String url;
int threadNum;
Thread mThread;
public Test2(String url, int threadNum) {
this.url = url;
}
public void start(){
this.mThread = new Thread(this);
this.mThread.start();
}
@Override
public void run() {
System.out.println("TEST2 STARTED!");
for (int i = 0; i < 2; i++) {
System.out.println(url);
}
}
}
输出:
MAin STARTED!
MAIN FINISHED
TEST STARTED!
qwerty
TEST2 STARTED!
TEST2 STARTED!
qwerty
qwerty
TEST2 STARTED!
qwerty
qwerty
qwerty
答案 0 :(得分:10)
如何使主要流程最后结束?
我认为你的意思是主线程。您需要使用thread.join()
。你的主应该加入它产生的线程,子线程需要与它产生的线程连接。 thread.join()
在继续之前等待线程完成。
Test test = new Test("qwerty");
// start the test thread running in the background
test.start();
// do other stuff on the main thread
...
// wait for the test thread to finish
test.mThread.join();
在测试线程中你应该这样做:
// start other threads
for (int i = 0; i < wclw.length; i++) {
wclw[i] = new Test2(url, i + 1);
wclw[i].start();
}
// do other stuff in the test thread if necessary
...
// come back and wait for them all to finish
for (int i = 0; i < wclw.length; i++) {
wclw[i].mthread.join();
}
因此子线程将等待它产生的每个线程完成然后它将完成。主线程将等待子线程完成,然后最后完成。
仅供参考:主线程在子线程之前完成不是问题。子线程不是守护程序线程,因此JVM将在JVM关闭之前等待它们完成。
答案 1 :(得分:2)
使用Thread#join调用等待其他线程完成:
System.out.println("MAin STARTED!");
Test t = new Test("qwerty");
t.start();
t.mThread.join();
System.out.println("MAIN FINISHED");
答案 2 :(得分:1)
您还可以使用正在运行的线程的“守护程序”属性来解决此问题。
Thinking in Java - Daemon threads
“守护程序”线程是一个应该提供一般服务的线程 在后台只要程序运行,但不是一部分 该计划的本质。因此,当所有的非守护进程 线程完成后,程序终止。 相反,如果有的话 任何非守护程序线程仍在运行,程序不会终止。
方法 Test.start 应修改如下:
public void start(){
this.mThread = new Thread(this);
this.mThread.setDaemon(false); // This method must be called before the thread is started.
this.mThread.start();
}