java线程Thread的join方法。

1,方法的作用:

  父线程等待子线程的执行。

  如果是join或者join(0),即等待时长是0,父线程就会一直等到子线程执行结束,

如果是join(time),即等待时长是time数值,那父线程等待时长视情况而定:

    第一种:子线程执行时长不需要time时长,那么父线程就可能不会等待到time时长,为什么是可能呢?是不是要考虑其他线程(不包括父线程,和子线程以外的线程),他也可能让父线程等待的(没有获取到cpu时间片等原因),

    第二种:子线程执行时长超过time时长,那么父线程的等待时长,至少是time时长,

2,源码分析:

 1  public final synchronized void join(long millis)
 2     throws InterruptedException {
 3         long base = System.currentTimeMillis();
 4         long now = 0;
 5
 6         if (millis < 0) {
 7             throw new IllegalArgumentException("timeout value is negative");
 8         }
 9
10         if (millis == 0) {
11             while (isAlive()) {
12                 wait(0);
13             }
14         } else {
15             while (isAlive()) {
16                 long delay = millis - now;
17                 if (delay <= 0) {
18                     break;
19                 }
20                 wait(delay);
21                 now = System.currentTimeMillis() - base;
22             }
23         }
24     }

  

    1.首先确定的是join方法的形参必须是大于零的数值,否则该方法抛出异常IllegalArgumentException("timeout value is negative");

   2. join(0),进入循环:

      while (isAlive()) {

               wait(0);

      }      那么isAlive是什么意思呢? isAlive是指子线程start并且run方法还没执行完,子线程是活着的,所以如果你在子线程start之前,调用join方法,是没任何效果的,此时子线程是死的。  3.join(time),进入循环:
          while (isAlive()) {          long delay = millis - now;
                 if (delay <= 0) {
                     break;
                 }
                 wait(delay);
                 now = System.currentTimeMillis() - base;
          }   代码意思:

      第一种:子线程执行时长不需要time时长,那么父线程就可能不会等待到time时长,循环条件isAlive()=false,父线程出来了

      第二种:子线程执行时长超过time时长,那么父线程的等待时长,至少是time时长,父线程break出来的。

总结:

  你要记住的唯一结论是:父线程肯定会等子线程执行一段时间,至于这段时间是多少?要区别看待,

  join(0)时:肯定是等到子线程执行完,父线程再执行;

   join(time)时:等到子线程执行完     或者    至少等time时长,父线程再执行。

时间: 2024-10-10 09:30:11

java线程Thread的join方法。的相关文章

模拟做饭系统(java+线程中的join方法)

(一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+(没有调用jion方法) (二)有线程控制(妈妈进程和儿子进程又先后影响)+(调用jion方法) 项目的结构图: (二)没有进程控制mintak Son.java主要是模拟儿子的行动,儿子买酱油的行动(与有进程控制的源程序相同) 代码如下: public class Son implements R

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() 方法

Thread中的 join() 方法在实际开发过程中可能用的不是很多,但是在面试中作为考察基本功知识的扎实与否,经常会被用到.因此,对于 Thread 的 join() 方法进行了一定的研究. 常见的一种情景是如何保证创建多个线程保证其按照指定的顺序执行,最简单的一种方法是采用Thread.join() 方法来实现.以下是写的创建若干个线程的示例代码,通过采用创建一个实体类,重写其里面的run 方法来实现.如果指定少数的线程数,可以直接采用 thread.join()来实现,其原理是一致的. 1

停止Java线程,小心interrupt()方法

程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误. 在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程. 背景     中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作.线程是死亡.还是等待新的任务或是继续运行至下一步,就取决于这个程序.虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果.你最好还是牢记以下的几点告诫. 首先,忘掉

java线程的几个方法

线程的生命周期:新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 就绪状态:当一个线程创建了以后,其他的线程调用了它的start()方法,该线程就进入了就绪状态.处于这个状态的线程位于可运行池中,等待获得CPU的使用权 运行状态:处于这个状态的线程占用CPU,执行程序的代码 阻塞状态:当线程处于阻塞状态时,java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态. 阻塞状态分为三种情况: 1. 位于对象等待池中的

java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍

(原创,转载请说明出处!谢谢) 目录: --线程的创建: --启动线程 --线程的调度 --Thread 类的简介 --线程的同步/异步 --wait() 和 notify(),notifyAll()方法 在讲线程之前,先说下进程. 进程是运行系统中,每个独立运行的程序.例如win7,我既用酷狗软件听歌,又玩 LOL 游戏,又上QQ,那么这就有3个进程. 线程:一个进程里面有很多线程,进程是由线程组成的,线程的结束不一定会导致进程结束,而一个进程的结束,则会连带它里面的所有线程被结束. ----

Java线程Thread及其常用方法

Java SE7 API - Thread: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield%28%29 一.线程的简介 当JVM启动的时候, 通常会有一个独立的非守护线程(也就是类中的main方法所在的线程).JVM会继续运行,除非发生以下情况: Runtime类的exit()方法被调用,并且安全管理者允许退出发生. 所有非守护线程都已经死了,不管是从run方法中返回的还是因为run方法中抛出了异常. 注

JAVA线程sleep和wait方法区别

一 sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁.由于没有释放对象锁,所以不能调用里面的同步方法. sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用.目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;sleep()是Thread类的Static(静态)的方法:因此他不能改变对象的机锁,所以当在一个Synchronized块

java 线程 --- Thread,Runnable,Callable 基础学习

java 使用 Thread 类代表线程,所有现场对象都必须是 Thread 类或者其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流.java 使用线程执行体来代表这段程序流. 1.继承Thread 类创建线程 启动多线程的步骤如下: (1)定义Thread 类的子类,并重写该类的run() 方法,该run() 方法的方法体就代表类线程需要完成的任务.因此把run() 方法称为线程执行体. (2)创建 Thread 子类的实例,即创建线程对象. (3)调用线程的star()