简体   繁体   English

在java中反向使用Thread.join()

[英]reverse using of Thread.join() in java

I know that I can use the following to have thread B waiting for thread A to finish before proceeding: 我知道我可以使用以下内容让线程B在继续之前等待线程A完成:

class A extends Thread{
    public void run(){
        ....
    }
}
class B extends Thread{
    private Thread someThread;
    B(Thread t){
        someThread=t;
    }
    public void run(){
        someThread.join();
        ...//then proceed
    }
}

But how can I do this in the run() of A to call B and then wait it finish before proceeding? 但是我如何在Arun()中执行此操作以调用B然后等待它继续之前完成? That is, I want something like 也就是说,我想要类似的东西

class A extends Thread{
    private Thread someThread;
    B(Thread t){
        someThread=t;
    }
    public void run(){
        //*how to start B and wait it finish?
        ...//then proceed
    }
}
class B extends Thread{
    public void run(){
        ....
    }
}

Same deal: 相同的交易:

class A extends Thread{
    private Thread someThread;
    A(Thread t){
        someThread=t;
    }
    public void run(){
        someThread.start();
        someThread.join();
        // proceed
    }
}
class B extends Thread{
    public void run(){
        ....
    }
}

If possible, a simpler solution would be to start B first, then b.join(); 如果可能的话,更简单的解决方案是首先启动B ,然后是b.join(); , and do the same for A in the client code: ,并在客户端代码中为A执行相同操作:

b.start();
b.join();
a.start();
a.join();

There is no sense in starting a thread for it to just fire up and join on another tread before proceeding. 开始一个线程没有任何意义,只是在继续之前启动并加入另一个胎面。

Find below example for how to reverse execute the thread.? 在下面找到如何反向执行线程的示例。

We can use join method for this case. 我们可以在这种情况下使用join方法。

    package interview.thread;
     public class RevarseThreadExcute {
    public static void main(String[] args) throws InterruptedException {
   Thread t3 = new Thread(new Runnable() {
    @Override
            public void run() {

                for (int i = 0; i < 10; i++) {
                    System.out.println("Thread 3 =" + i);

                }
            }
        });
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
               try {
                t3.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                for (int i = 0; i < 10; i++) {
                    System.out.println("Thread 2 =" + i);

                }
            }
        });

        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    t3.join();
                    t2.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                for (int i = 0; i < 10; i++) {
                    System.out.println("Thread 1 =" + i);

                }
            }
        });

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


}

outpot: outpot:

Thread 3 =0
Thread 3 =1
Thread 3 =2
Thread 3 =3
Thread 3 =4
Thread 3 =5
Thread 3 =6
Thread 3 =7
Thread 3 =8
Thread 3 =9
Thread 2 =0
Thread 2 =1
Thread 2 =2
Thread 2 =3
Thread 2 =4
Thread 2 =5
Thread 2 =6
Thread 2 =7
Thread 2 =8
Thread 2 =9
Thread 1 =0
Thread 1 =1
Thread 1 =2
Thread 1 =3
Thread 1 =4
Thread 1 =5
Thread 1 =6
Thread 1 =7
Thread 1 =8
Thread 1 =9
class A extends Thread{

    private Thread someThread;

    B(Thread t){
        someThread=t;
    }
    public void run(){
        someThread.join()
        //do stuff
    }
}

class B extends Thread{

    public void run(){
        ....
    }
}
Thread b = new B();
b.start();
b.join();

But why would you want to? 但你为什么要这样做? The idea of threads is to do things in parallel. 线程的想法是并行处理事情。 Why would you start a thread and immediately wait for it to finish? 你为什么要开始一个线程并立即等待它完成? Just execute the stuff from B in place in A. 只需在A中执行B中的东西。

You can use join() to wait for any thread. 您可以使用join()等待任何线程。

final Thread a = Thread.currentThread();
new Thread(new Runnable() {
    public void run() {
        // do something
        a.join();
        // calling thread finished.
    }
 }).start();
 // do something.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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