浅析Thread的join() 方法

  Thread中的 join() 方法在实际开发过程中可能用的不是很多,但是在面试中作为考察基本功知识的扎实与否,经常会被用到。因此,对于 Thread 的 join() 方法进行了一定的研究。

  常见的一种情景是如何保证创建多个线程保证其按照指定的顺序执行,最简单的一种方法是采用Thread.join() 方法来实现。以下是写的创建若干个线程的示例代码,通过采用创建一个实体类,重写其里面的run 方法来实现。如果指定少数的线程数,可以直接采用 thread.join()来实现,其原理是一致的。

 1 public class Demo extends Thread{
 2     int i;
 3     Thread previousThread;
 4     public Demo3(int i, Thread previousThread) {
 5         this.i = i;
 6         this.previousThread = previousThread;
 7     }
 8
 9     @Override
10     public void run(){
11         try {
12             previousThread.join();
13         } catch (InterruptedException e) {
14             e.printStackTrace();
15         }
16         System.out.println("顺序:"+i);
17     }
18
19     public static void main(String[] args) {
20         Thread previousThread = Thread.currentThread();
21         for (int i=0; i<10; i++){
22             Demo3 demo3 = new Demo3(i, previousThread);
23             demo3.start();
24             previousThread = demo3;
25         }
26
27     }
28
29 }

  上述代码实现了想要的业务逻辑需求,那么其原理又是什么呢?老规矩,看源码。

  

  

  我们可以发现,其保证多个线程按照顺序执行的根本是采用了 wait()方法。当 millis为0时,表示没有设置阻塞的时间,通过 isAlive()方法判断线程的存活状态;若存活,则一直等待。只有当这个线程不存活时,才会停止阻塞,即保证了线程的顺序执行。需要注意的一点时,因为调用了 wait() 方法,因此其必须用 synchronized 修饰,保证在方法层面上的同步。

原文地址:https://www.cnblogs.com/Demrystv/p/11519748.html

时间: 2024-10-27 07:03:45

浅析Thread的join() 方法的相关文章

Thread线程join方法自我理解

thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.join();后面的代码 thread.join(long time):线程thread等待time时间之后,main-thread可以执行,注意time时间后,线程thread没有执行完,main-thread也可以运行 注意:上面2个方法必须在线程是alive的时候,才有这样的效果,否则不会有. join()方法源码是有调用wait()

C#中多线程Thread的Join方法

当我们的程序中使用多线程时,对资源的操作是需要特别留意的.如下面的例子:程序中有两个string对象(初始值为空),main函数中分别开启了两个线程去分别设置这两个string对象的值,然后在main函数中打印出这两个字符串的值.代码如下: static string str1 = string.Empty; static string str2 = string.Empty; static void Main(string[] args) { Thread worker1 = new Thre

8.Thread的join方法

1.Thread类的join方法表示:当前线程执行结束再执行其它线程!在Thread类中有三个重载的方法分别是: public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("tim

java线程Thread的join方法。

1,方法的作用: 父线程等待子线程的执行. 如果是join或者join(0),即等待时长是0,父线程就会一直等到子线程执行结束, 如果是join(time),即等待时长是time数值,那父线程等待时长视情况而定: 第一种:子线程执行时长不需要time时长,那么父线程就可能不会等待到time时长,为什么是可能呢?是不是要考虑其他线程(不包括父线程,和子线程以外的线程),他也可能让父线程等待的(没有获取到cpu时间片等原因), 第二种:子线程执行时长超过time时长,那么父线程的等待时长,至少是ti

Thread中join()方法进行介绍

http://www.cnblogs.com/skywang12345/p/3479275.html https://blog.csdn.net/dabing69221/article/details/17472901 原文地址:https://www.cnblogs.com/yufeng218/p/9932721.html

Thread.Join() 方法

1. 什么是 the calling thread? 2. 什么是 a thread? 运行一个程序,即开启了一个进程和至少一个线程,干活的是线程而非进程!the calling thread 我们可以认为是MainThread(或者调用线程的线程,是不是有点绕?呵呵),a thread 我们就认为是被调用的线程. 最后,我们可以这样翻译MSDN:当 a thread 调用Join方法的时候,MainThread 就被停止执行,直到 a thread 线程执行完毕. 下面是测试代码: using

java--java.lang.Thread.join() 方法

Thread类join()方法重载了3次.分别是 join()throws InterruptedException; //无参数的join()等价于join(0),作用是一直等待该线程死亡 join(long millis, int nanos) throws InterruptedException;  //最多等待该线程死亡millis毫秒 join(long millis, int nanos) throws InterruptedException ; //最多等待该线程死亡milli

Java多线程中的join方法

新建一个Thread,代码如下: 1 package com.thread.test; 2 3 public class MyThread extends Thread { 4 private String name; 5 public MyThread(String name) { 6 this.name = name; 7 } 8 @Override 9 public void run() { 10 for (int i = 0; i < 100; i++) { 11 System.out.

Thread 的join

Context: threadObject:为Thread对象(以下带至) Thread的Join方法: 1.会暂停当前的线程,运行调用该方法的Thread对象所对应的线程将开始执行. 注意点: 1.Thread内部有个判断isAlive() 判断,注释是Tests if this thread is alive. A thread is alive if it has been started and has not yet died.也就是说没有threadObject.start(),th