Java多线程之join篇

       Java中多线程至关重要,其中有个叫做Thread.join()的方法,十分关键。这个方法具体有什么作用呢,它又是怎么工作的,有什么原理呢,让我们一起来看一下。

1、Join的作用

       Join方法的作用,其实就是表示一旦某个线程调用了join方法,那么就要一直运行到该线程运行结束,才会运行其他进程,我们可以有一个例子来对比一下。

      1.1、不使用Join
package com.dingtao.test;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class MyThread {

    public  static  void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    System.out.print(Thread.currentThread().getName()+"  ");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    System.out.print(Thread.currentThread().getName()+"  ");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        });

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

运气代码,结果是:


       可以看到,这里两个线程,线程1和线程0混合在一起输出,这表示内部CPU在交替执行线程0和线程1,它们几乎是轮流获取了CPU,用以执行线程,之后再将CPU资源让给另外一个线程。当我们使用了Join方法之后,再看程序的执行结果。

     1.2、使用Join方法

直接上代码:

package com.dingtao.test;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class MyThread {

    public  static  void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    System.out.print(Thread.currentThread().getName()+"  ");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    System.out.print(Thread.currentThread().getName()+"  ");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        });

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

这里再看结果,就可以看到结果意见是这样的了。


如图所示,由于在t2.start()调用t2线程前,使用了 t1.join(),所以直到所有Thread-0执行完毕后,Thread-1才开始执行。

2、join的原理

       任何地方当调用了t.join(),就必须要等待线程t执行完毕后,才能继续执行其他线程。这里其实是运用了Java中最顶级对象Object提供的方法wait()。wait()方法用于线程间通信,它的含义是通知一个线程等待一下,让出CPU资源,注意这里是会放弃已经占有的资源的。直到t线程执行完毕,再调用notify()唤醒当前正在运行的线程。

你可能感兴趣的:(JAVA常见问题,Java面试常用基础知识点)