join作用是让其他线程变为等待,我先执行。thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程(先执行指定的线程,再执行当前的线程)。比如在线程B(如主线程)中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
public class Demo11Join { public static void main(String[] args) { JoinThread joinThread = new JoinThread(); Thread thread1 = new Thread(joinThread, "线程1"); Thread thread2 = new Thread(joinThread, "线程2"); Thread thread3 = new Thread(joinThread, "线程3"); thread1.start(); thread2.start(); thread3.start(); try { thread1.join(); } catch (Exception e) { } for (int i = 0; i < 5; i++) { System.out.println("main ---i:" + i); } } static class JoinThread implements Runnable { private Random random = new Random(); public void run() { String name = Thread.currentThread().getName(); for (int i = 0; i < 5; i++) { try { Thread.sleep(random.nextInt(10)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + "内容是:" + i); } } } }
其中一次执行结果如下:
线程2内容是:0 线程1内容是:0 线程1内容是:1 线程2内容是:1 线程3内容是:0 线程2内容是:2 线程2内容是:3 线程3内容是:1 线程1内容是:2 线程3内容是:2 线程2内容是:4 线程3内容是:3 线程1内容是:3 线程1内容是:4 main ---i:0 main ---i:1 main ---i:2 main ---i:3 main ---i:4 线程3内容是:4
如果不调用线程1的join方法:
public class Demo11Join { public static void main(String[] args) { JoinThread joinThread = new JoinThread(); Thread thread1 = new Thread(joinThread, "线程1"); Thread thread2 = new Thread(joinThread, "线程2"); Thread thread3 = new Thread(joinThread, "线程3"); thread1.start(); thread2.start(); thread3.start(); for (int i = 0; i < 5; i++) { System.out.println("main ---i:" + i); } } static class JoinThread implements Runnable { private Random random = new Random(); public void run() { String name = Thread.currentThread().getName(); for (int i = 0; i < 5; i++) { try { Thread.sleep(random.nextInt(10)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + "内容是:" + i); } } } }
其中一次执行结果如下:
main ---i:0 main ---i:1 main ---i:2 main ---i:3 main ---i:4 线程3内容是:0 线程2内容是:0 线程3内容是:1 线程2内容是:1 线程3内容是:2 线程1内容是:0 线程2内容是:2 线程2内容是:3 线程1内容是:1 线程2内容是:4 线程3内容是:3 线程1内容是:2 线程3内容是:4 线程1内容是:3 线程1内容是:4