如何使主要结束?

时间:2013-05-17 21:21:27

标签: java multithreading

如何让主流程最后结束?

例如,我编写了一些代码,创建了一个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

3 个答案:

答案 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();
}