/*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);
}
}
}