Java多线程join方法实例分析

/*src: https://blog.csdn.net/Hollake/article/details/89945762 */

/**首先看一下相关教材上怎么说的:
    如果一个线程A执行了thread.join()语句,
    其含义是:
      当前线程A等待thread线程终止后才从thread方法返回。*/

package sunweiqin.java.oo.programming.chapter13.inheritance_class_Thread.join.exemplification1;
public class LockTest {
//接下来我们直接看例子,不出意外,和我们预想的一样,线程A和线程B交替输出结果。

/**输出结果:
 * 
Thread A.-----current value is : 0
Thread B.-----current value is : 0
Thread A.-----current value is : 1
Thread A.-----current value is : 2
Thread A.-----current value is : 3
Thread B.-----current value is : 1
Thread A.-----current value is : 4
Thread B.-----current value is : 2
Thread B.-----current value is : 3
Thread B.-----current value is : 4
*/
	public static void main(String[] args) throws InterruptedException {
	 
		Thread A = new Thread(new Thread_(),"Thread A.");
		Thread B = new Thread(new Thread_(),"Thread B.");
		A.start();
        B.start();
	}
}


class Thread_ implements Runnable{
	public void run() {
		for(int i=0;i<5;i++) {
			System.out.println(Thread.currentThread().getName()+"-----current value is : "+i);
		}
	}
}

 

/*src: https://blog.csdn.net/Hollake/article/details/89945762 */
package sunweiqin.java.oo.programming.chapter13.inheritance_class_Thread.join.exemplification2;
public class LockTest {
	public static void main(String[] args) throws InterruptedException {
		 
		Thread A = new Thread(new Thread_(),"Thread A.");
		Thread B = new Thread(new Thread_(),"Thread B.");
		
		A.start();
		A.join(); /*<---现在将A.join()注释取消:*/
		B.start();
		
		/**运行程序后,输出结果如下:
		Thread A.-----current value is : 0
		Thread A.-----current value is : 1
		Thread A.-----current value is : 2
		Thread A.-----current value is : 3
		Thread A.-----current value is : 4
		Thread B.-----current value is : 0
		Thread B.-----current value is : 1
		Thread B.-----current value is : 2
		Thread B.-----current value is : 3
	 	Thread B.-----current value is : 4
	  */
		/**
		 * 这是为什么呢,为什么是线程A执行完毕后线程B才开始执行输出结果呢?
		 * 注意,
           我们这里是在主程序main方法中调用了A.join()方法,
           按照教材定义就是main线程调用了A.join()语句,
		 * 那么main线程会等待A线程中止后才会继续执行,
           也就是主线程走到A.join()这行代码时,就会把自己的线程挂起进行等待,
           等待A线程终止后才会继续往下走,所以接着执行B.start()。
		 * 
		 * 再多说一句,

           这里线程A和线程B没有半毛钱关系,
           A和B都是主线程的子线程,它俩只会和主线程进行交互。
		 * 不是有些文章中提到的B线程进入等待状态,等待A线程执行完才会自己执行。
		 * 这是错的,
           好好看定义,在哪个线程中调用join方法,就是哪个线程挂起,
           等待使用join方法的线程执行完继续执行。
		 */
	}
}


class Thread_ implements Runnable{
	public void run() {
		for(int i=0;i<5;i++) {
			System.out.println(Thread.currentThread().getName()+"-----current value is : "+i);
		}
	}
}

上面代码

sunweiqin.java.oo.programming.chapter13.inheritance_class_Thread.join.exemplification2.LockTest.java 

的示意图

/*src: https://blog.csdn.net/Hollake/article/details/89945762 */
package sunweiqin.java.oo.programming.chapter13.inheritance_class_Thread.join.exemplification3;
 
public class LockTest {
	public static void main(String[] args) throws InterruptedException {
	 
		Thread A = new Thread(new Thread_(),"Thread A.");
		Thread B = new Thread(new Thread_(),"Thread B.");
		
		A.start();
		B.start();

        /**!如下一行是自己添加,原文没有。因为不添加这一行,不能出现A线程和B线程交替打印的效    
        果。*/
        Thread.sleep(3500); 


		/**
		 * 接着我们来说一些文章提到的这种情况:
           把A.jion()放到B.start()后,也就是下面代码中的情况:*/

		A.join();
		

	     /*	输出结果是A线程与B线程交替打印,有人说不理解,那我们继续分析,
            主线程开始执行,
		 *  执行到A.start(),继续执行B.start(),这个时候AB两个线程已经开始执行,
            在控制台交替打印了,
            然后接着执行到A.join()方法<这个时候主线程挂起>,
		 *  而此时A线程与B线程都已经开始执行, 顺序是交替打印,
            再把主线程挂起已经没有任何意义了.

		 *  只有等到A线程中止后才会接着执行B线程的for循环。

            再次强调,和B没关系,线程B爱什么时候输出什么时候输出。
            哪怕B线程输出到A线程的for循环后面,当前在实际中也是不太可能。
	*/}
}


class Thread_ implements Runnable{
	public void run() {
		for(int i=0;i<5;i++) {
			System.out.println(Thread.currentThread().getName()+"-----current value is : "+i);
		}
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值