1、Thread join:可以让当前线程等待另一个指定的线程结束,在另一个线程结束之前,当前线程会阻塞,join方法通常用来等待子线程。
2、用法:常见的形式有两种:空参的join方法和带时间参数的join方法。空参的join方法不带任何参数,它表示等待调用join方法的线程执行完毕,它会阻塞当前线程,直到调用join方法的线程执行完毕,当前线程才会继续运行;带时间参数的join方法表示等待指定的时间,它也会阻塞当前线程,但是时间一到,即使调用join方法的线程没有执行完毕,当前线程也会继续运行。
3、使用: thread1.start();
Thread2.start();
thread1.join();
Thread2.join();
在调用它们的join方法前,尽量确保它们的start的方法已经被调用,如果没有调用start方法,那么调用join方法,实现的就不是阻塞功能而是调用当前线程的run方法。
4、注意:在调用join方法时,它一般用来等待子线程结束,而不能强制让子线程结束,因为需要等到子线程运行完毕后才能结束,所以它是一个被动的等待。
5、使用场景:join方法大量用在实现多线程的场景中,用来等待其他线程完成任务之后再继续执行任务,如先运行子线程去读取文件,完成之后再运行主线程处理文件的场景中,主线程会使用join方法等待子线程运行完毕之后再继续执行。
thread join
1.thread join何时使用:thread join方法是用来强制等待一个线程执行完毕后再继续执行下面的程序或脚本。比如:如果一个脚本中有多个线程,调用者希望所有线程执行完毕后再继续执行下面的程序或脚本,那么可以使用thread join来强制等待线程执行完毕后再继续执行;
2.thread join实现原理: thread join方法是使用原子操作(atomic operation)和一个信号量( Semaphore )来实现的。当用户调用 thread join的时候,线程会递减信号量的计数器,然后当剩下的线程数达到0的时候,会有一个原子操作使信号量的计数器加1,然后再继续执行下面的程序或脚本;
3.thread join的注意事项:一定要注意保护脚本中的数据,因为多个线程共享该数据,当多个线程同时读取、写入该数据时,由于线程速度不确定,容易造成数据混乱,所以在调用thread join之前,一定要使用信号量实现互斥;
4.thread join的应用:比如一个爬虫程序,可以使用thread join来实现控制线程的执行,比如在爬取一个网站的所有图片时,可以使用thread join创建多个线程,每个线程负责爬取一部分图片,当各个线程爬取完毕后,再通过调用thread join来强制等待所有线程执行完毕;
5.thread join的性能: thread join的性能优势很大,因为使用了原子操作来等待所有线程执行完毕。比起非原子操作,原子操作更能有效避免死锁的发生,从而提高程序运行的效率。