Java Thread类的join()方法小结

最近在编程遇到了个需要异步执行的操作,经过了一番折腾,发现在主子线程 操作中join()方法是非常实用且有效的一个方法.

先来看join()及其重载(overload)方法的说明和代码:

join()方法:

 1     /**
  2      * Waits for this thread to die.
  3      *
  4      * @exception  InterruptedException if another  thread has interrupted
  5      *             the current thread.   The <i>interrupted status</i> of the
  6      *             current thread is  cleared when this exception is thrown.
  7      */
  8     public final void join() throws  InterruptedException {
  9         join(0);
10     }

join(long millis)方法:

1     /**
  2      * Waits at most <code>millis</code>  milliseconds for this thread to
  3      * die. A timeout of <code>0</code>  means to wait forever.
  4      *
  5      * @param      millis   the time to wait  in milliseconds.
  6      * @exception  InterruptedException if another  thread has interrupted
  7      *             the current thread.   The <i>interrupted status</i> of the
  8      *             current thread is  cleared when this exception is thrown.
  9      */
10     public final synchronized void join(long millis) throws InterruptedException {
11
12         long base = System.currentTimeMillis();
13         long now = 0;
14
15         if (millis < 0) {
16             throw new IllegalArgumentException ("timeout value is negative");
17         }
18
19         if (millis == 0) {
20             while (isAlive()) {
21                 wait(0);
22             }
23         } else {
24             while (isAlive()) {
25                 long delay = millis -  now;
26                 if (delay <= 0) {
27                     break;
28                 }
29                 wait(delay);
30                 now = System.currentTimeMillis () - base;
31             }
32         }
33     }

时间: 2024-11-08 17:46:39

Java Thread类的join()方法小结的相关文章

关于java多线程中的join方法

问题描述 关于java多线程中的join方法 1.主线程可能在子线程结束之前 结束吗?如果可能的话 举一个例子 2.如何理解join方法, 结合实际应用. 非常感谢非常感谢!!! 解决方案 关于join,参考:http://www.blogjava.net/jnbzwm/articles/330549.html 解决方案二: 主线程可能在子线程结束之前 结束吗 一般来说不可以,但是也不一定,如果子线程在执行finally中的代码,应该会等它执行完了才退出. 晕,join方法和什么"让主线程等子线

Java中Spring获取bean方法小结_java

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢? Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高级IoC的配置机制.BeanFactory使管理不同类型的Java对象成为可能,应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供

java thread start()和run()方法简析_java

1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码: 通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行. 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体, 它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止, 而CPU再运行其它线程, 2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执

java基本教程之join方法详解 java多线程教程_java

本章涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 1. join()介绍join() 定义在Thread.java中.join() 的作用:让"主线程"等待"子线程"结束之后才能继续运行.这句话可能有点晦涩,我们还是通过例子去理解: 复制代码 代码如下: // 主线程public class Father extends Thread {    public void run() {     

关于JAVA中this的使用方法小结_java

我知道很多朋友都和我一样:在JAVA程序中似乎经常见到"this",自己也偶尔用到它,但是到底"this"该怎么用,却心中无数!很多人一提起它,就说"当前对象",可到底什么是当前对象,是什么当前对象,他自己也不清楚.现在让大家看一个小例子,给你分享一下JAVA中"this"的用法! 复制代码 代码如下: /**  * @author fengzhi-neusoft  *  * 本示例为了说明this的三种用法!  */ pac

java常用类的使用方法(辛苦收集)

问题描述 解决方案 解决方案二:顶你!!解决方案三:我比较相信javadoc解决方案四:这还要分呢~~解决方案五:引用3楼zn85600301的回复: 这还要分呢~~ 哈哈一个是高手收藏一个是辛苦收集的

Java多线程初学者指南(5):join方法的使用

在上面的例子中多次使用到了Thread类的join方法.我想大家可能已经猜出来join方法的功能是什么了.对,join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法.如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完.而使用join方法后,直到这个线程退出,程序才会往下执行.下面的代码演示了join的用法.

java线程之join方法的使用介绍_java

在上面的例子中多次使用到了Thread类的join方法.我想大家可能已经猜出来join方法的功能是什么了.对,join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法.如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完.而使用join方法后,直到这个线程退出,程序才会往下执行.下面的代码演示了join的用法.

java线程之用Thread类创建线程的方法_java

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread类的构造方法被重载了八次,构造方法如下: 复制代码 代码如下: public Thread( ); public Thread(Runnable target); public Thread(String name); public Thread