在主函数中,我们如果创建两个线程 那么他们两个和主函数是一起进行的
比如说我们一个线程求10000以内的素数之和 一个线程求10000以内完全数之和 主线程求这两个总数的乘积
按道理说应该是先求出素数之和,完全数之和 再求乘积 但是主线程和他们两个是同时进行的 所以很有可能是先输出了两个数的乘积 再求出两个和 这样就无法得到我们需要的数字
所以引出我们的Thread.join()函数 在start()函数后进行 这个函数代表先让进行join()函数的线程run()完,然后再进行后面的线程
public class PrimeandPerfect { public static void main(String args[]) { BigInteger Sum = BigInteger.valueOf(0); Prime prime = new Prime(); Perfect perfect = new Perfect(); prime.start(); perfect.start(); // 必须写这个,不然会直接进行后面的计算 try { prime.join(); perfect.join(); } catch(InterruptedException e) // 必须返回这个类型的错误 { System.out.println(e); } Sum = perfect.sum.multiply(prime.sum); System.out.println(Sum); } }这里prime和perfect都使用了join函数,所以这两个是同时进行的 这两个线程都进行完之后,再进行主线程
再举个例子 如果线程 A 和线程 B都是输出123``
A.strat() B.start() A.join()这个时候是主线程执行A.start(),B.start(),然后遇到A.join() 才会挂起主线程,所以A和B还是交替输出
如果是
A.strat() A.join() B.start()主线按顺序遇到A.join(),主线程挂起 先等A.start()执行完,才会继续走到后面的B.start()
