java中线程__Thread.join()用途通俗语言理解

理解代码1来源:https://www.jianshu.com/p/fc51be7e5bc0
理解代码2来源:https://www.jianshu.com/p/595be9eab056

 一, 先解释Thread.join()的作用
        比如有两个线程在一个程序中,分别为线程1,线程2!
        其中,线程1,开始新先运行起来(run),线程运行的时候一个概念(有时间片,时间片就是所谓的规定可以运行多长的时间))!
        当线程1,在这个时间片之内没有运行完成,就有可能被线程2给抢夺运行权,从而执行线程2的程序!
        造成程序无法按照原有的顺序进行运行,导致结果造成偏差!

       解决办法:就是使用Thread.join
     1,  在线程1程序之后,加上线程1.join(); 这个方法。并且这个方法需要在线程2程序的前面!
       保证只有线程1跑完成以后,才会进行跑线程2这个程序!
     2, 如果线程1,跟线程2有相交运行的可能性(也就是线程2的程序中包含线程1.join();方法),那么结果会产生两个:  第一个:线程1,可能已经运行完毕!然后在运行 线程2!(那么线程1.join()方法则没有地方发挥作用)
        第二个:线程1,可能没有运行完毕!然后开始运行线程2,但是由于线程1.join()的影响,导致线程2没有运行完毕,然后又重新去跑线程1,并且直到线程1运行完毕,然后线程2才会跟着运行完毕!

二,总结
Thread.join() 其实就是为了保证一个线程能够按照顺序去执行,并且保证将一个线程能完全的执行完毕后,再去执行其他的线程!

       下列代码有相应的解释:

代码1:
public class JoinDemo extends Thread{
int i;
Thread previousThread;
public JoinDemo(Thread previousThread,int i){
this.previousThread=previousThread;
this.i=i;
}
@Override
public void run() {
try {
previousThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“num:”+i);
}
public static void main(String[] args) {
//获得一个线程,而这个线程是main() 主函数线程
Thread previousThread=Thread.currentThread();
for(int i=0;i<10;i++){
//将对象进行实例化
JoinDemo joinDemo=new JoinDemo(previousThread,i);
//Thread.start() 可以调用run方法,开始运行,并且在run方法汇总调用了join()方法,会保证JoinDemo先运行完毕,然后去输出System.out.println(“num:”+i);然后再通过for循环去逐步进行自增得出相应的值
joinDemo.start();
previousThread=joinDemo;
}
}
}

 注意:1,可以将previousThread.join()方法去掉,然后进行试运行;
             2,在previousThread.join()的方法后面增加 Thread.sleep(2000),然后再进行试运行;

代码2:
class BThread extends Thread {
public BThread() {
super("[BThread] Thread");
}

@Override
public void run() {
    String threadName = Thread.currentThread().getName();
    System.out.println(threadName + " start.");
    try {
        for (int i = 0; i < 5; i++) {
            System.out.println(threadName + " loop at " + i);
            Thread.sleep(1000);
        }
        System.out.println(threadName + " end.");
    } catch (Exception e) {
        System.out.println("Exception from " + threadName + ".run");
    }
}

}
class AThread extends Thread {
BThread bt;

public AThread(BThread bt) {
    super("[AThread] Thread");
    this.bt = bt;
}
@Override
public void run() {
    String threadName = Thread.currentThread().getName();
    System.out.println(threadName + " start.");
    try {
        bt.join();
        System.out.println(threadName + " end.");
    } catch (Exception e) {
        System.out.println("Exception from " + threadName + ".run");
    }
}

}
public class TestDemo {
public static void main(String[] args) {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " start.");
BThread bt = new BThread();
AThread at = new AThread(bt);
try {
bt.start();
Thread.sleep(2000);
at.start();
at.join();
} catch (Exception e) {
System.out.println(“Exception from main”);
}
System.out.println(threadName + " end!");
}
}

上面的代码:可以通过一开始的解释去查看,就能理解了!
注意:可以再bt.join();这行的前面增加一个Thread.sleep(2000),如果机器差的话,sleep时间可以稍微加长一点,然后再试这运行这行代码!
对比结果!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值