简体   繁体   中英

Make one thread wait for another to finish

I have two thread classes: one that prints numbers from 0 to 9, and another from 100 to 109. What I want is to make the first thread wait for the other one to finish. For this, I used the join() method, but it's not working. Please tell me where I'm going wrong:

//demonstrates the use of join() to wait for another thread to finish
class AThread implements Runnable {
    Thread t;

    AThread() {
        t = new Thread(this);
    }

    public void run() {
        try {
            for (int i=0; i<10; i++) {
                System.out.println(i);
                Thread.sleep(10);
            }
        } catch (InterruptedException e) {
            System.out.println(t + " interruped.");
        }
    }

    public void halt(Thread th) {
        try {
            th.join();
        } catch (InterruptedException e) {
            System.out.println(t + " interruped.");
        }
    }
}

//a different thread class (we distinguish threads by their output)
class BThread implements Runnable {
    Thread t;

    BThread() {
        t = new Thread(this);
    }

    public void run() {
        try {
            for (int i=100; i<110; i++) {
                System.out.println(i);
                Thread.sleep(10);
            }
        } catch (InterruptedException e) {
            System.out.println(t + " interruped.");
        }
    }
}

public class WaitForThread {
    public static void main(String[] args) {
        AThread t1 = new AThread();
        BThread t2 = new BThread();

        t1.t.start();
        t1.halt(t2.t); //wait for the 100-109 thread to finish
        t2.t.start();
    }
}

You call join on the thread before it has started. That doesn't work; in that case, join will return immediately, it's not going to wait until the other thread has started and stopped later. You can see this in the API documentation:

Thread.join()

This implementation uses a loop of this.wait calls conditioned on this.isAlive .

Thread.isAlive()

Tests if this thread is alive. A thread is alive if it has been started and has not yet died.

Reorder the statements in your main method

t1.t.start();
t2.t.start();
t1.halt(t2.t); //wait for the 100-109 thread to finish

edit to answer your questions in the comments:

If you want the thread in AThread to wait for the thread in BThread to finish before doing its job, then you'll need to call join in AThread.run , and change your main method:

class AThread implements Runnable {
    Thread t;
    Thread threadToWaitFor;

    AThread(Thread threadToWaitFor) {
        t = new Thread(this);
        this.threadToWaitFor = threadToWaitFor;
    }

    public void run() {
        // First wait for the other thread to finish
        threadToWaitFor.join();

        // ...
    }

    // ...
}

public class WaitForThread {
    public static void main(String[] args) {
       BThread t2 = new BThread();
       AThread t1 = new AThread(t2.t);

        t2.t.start();
        t1.t.start();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM