文档章节

java并发编程 - 线程的join()示例

YuanyuanL
 YuanyuanL
发布于 2014/09/19 11:08
字数 789
阅读 155
收藏 1

Java7 API:  http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()

public final void join()
                throws InterruptedException
Waits for this thread to die.
An invocation of this method behaves in exactly the same way as the invocation
join(0)
Throws:
InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
public final void join(long millis)
                throws InterruptedException
Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.
This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

Parameters:
millis - the time to wait in milliseconds
Throws:
IllegalArgumentException - if the value of millis is negative
InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
public final void join(long millis,
        int nanos)
                throws InterruptedException
Waits at most millis milliseconds plus nanos nanoseconds for this thread to die.
This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

Parameters:
millis - the time to wait in milliseconds
nanos - 0-999999 additional nanoseconds to wait
Throws:
IllegalArgumentException - if the value of millis is negative, or the value of nanos is not in the range 0-999999
InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.

Java Tourial: http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

Joins

The join method allows one thread to wait for the completion of another. If t is a Thread object whose thread is currently executing,
t.join();
causes the current thread to pause execution until t's thread terminates. Overloads of join allow the programmer to specify a waiting period. However, as with sleep, join is dependent on the OS for timing, so you should not assume that join will wait exactly as long as you specify.

Like sleep, join responds to an interrupt by exiting with an InterruptedException.

用处

     t.jion()使得当前线程暂停,直到线程t终止,才继续执行。

    如此,在多线程时,可以确保线程的执行顺序。

代码1:

public class CustomThread1 extends Thread
{
    public CustomThread1()
    {
        super("CustomThread1");
    }
    @Override
    public void run()
    {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " start.");
        try
        {
            for (int i = 0; i < 5; i++)
            {
                Thread.sleep(1000);
                System.out.println(threadName + " loop at " + i);                
            }
            System.out.println(threadName + " end.");
        } catch (Exception e)
        {
            System.out.println("Exception from " + threadName + ".run");
        }
    }
}

public class CustomThread2 extends Thread
{
    CustomThread1 t1;

    public CustomThread2(CustomThread1 t1)
    {
        super("CustomThread2");
        this.t1 = t1;
    }

    @Override
    public void run()
    {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " start.");
        try
        {
            System.out.println("t1 join again");
            t1.join();
            System.out.println("t1 joined again");
            System.out.println(threadName + " end.");
        } catch (Exception e)
        {
            System.out.println("Exception from " + threadName + ".run");
        }
    }
}

public class JoinTestDemo
{
    public static void main(String[] args)
    {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " start.");
        CustomThread1 t1 = new CustomThread1();
        CustomThread2 t2 = new CustomThread2(t1);
        try
        {
            t1.start();
            Thread.sleep(3000);
            System.out.println("t1 jion");
            t1.join();
            System.out.println("t1 jioned");
            t2.start();
            System.out.println("t2 jion");
            t2.join();
            System.out.println("t2 jioned");
        } catch (Exception e)
        {
            System.out.println("Exception from main");
        }
        
        System.out.println(threadName + " end !");
    }
}

代码1运行结果:

main start.
CustomThread1 start.
CustomThread1 loop at 0
CustomThread1 loop at 1
t1 jion
CustomThread1 loop at 2
CustomThread1 loop at 3
CustomThread1 loop at 4
CustomThread1 end.
t1 jioned
t2 jion
CustomThread2 start.
t1 join again
t1 joined again
CustomThread2 end.
t2 jioned
main end !

代码2:

仅仅把代码1中JoinTestDemo类中main方法的try快修改为如下:

t1.start();
            Thread.sleep(3000);
            //System.out.println("t1 jion");
            //t1.join();
            //System.out.println("t1 jioned");
            t2.start();
            //System.out.println("t2 jion");
            //t2.join(); 
            //System.out.println("t2 jioned");

代码2运行结果:

main start.
CustomThread1 start.
CustomThread1 loop at 0
CustomThread1 loop at 1
CustomThread1 loop at 2
main end !
CustomThread2 start.
t1 join again
CustomThread1 loop at 3
CustomThread1 loop at 4
CustomThread1 end.
t1 joined again
CustomThread2 end.


参考资料:http://blog.csdn.net/bzwm/article/details/3881392


© 著作权归作者所有

下一篇: JDBC十佳实践
YuanyuanL

YuanyuanL

粉丝 154
博文 330
码字总数 194577
作品 0
济南
高级程序员
私信 提问
加载中

评论(2)

YuanyuanL
YuanyuanL 博主

引用来自“Gelopa”的评论

我来顶一下啊
谢谢~
金贞花
金贞花
我来顶一下啊
读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
717
1
Java多线程神器:join使用及原理

join() join()是线程类的方法,官方的说明是: Waits for this thread to die. 等待这个线程结束,也就是说当前线程等待这个线程结束后再继续执行,下面来看这个示例就明白了。 示例 结果输出...

java技术栈
2017/11/14
0
0
Java多线程学习(五)线程间通信知识点补充

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
2018/04/16
0
0
18《Java核心技术》之一个线程两次调用start()方法会出现什么情况?

一、提出问题 今天我们来深入聊聊线程,相信大家对于线程这个概念都不陌生,它是 Java 并发的基础元素,理解、操纵、诊断线程是 Java 工程师的必修课,但是你真的掌握线程了吗? 今天我们要一...

飞鱼说编程
2018/11/15
13
0
15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多...

LCZ777
2014/05/27
638
0

没有更多内容

加载失败,请刷新页面

加载更多

uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
17分钟前
4
0
Tomcat是如何实现异步Servlet的

前言 通过我之前的Tomcat系列文章,相信看我博客的同学对Tomcat应该有一个比较清晰的了解了,在前几篇博客我们讨论了Tomcat在SpringBoot框架中是如何启动的,讨论了Tomcat的内部组件是如何设...

木木匠
41分钟前
16
0
mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

hello 各位小伙伴大家好,我是小栈君,这期我们分享关于mysql中间件的研究,也就是数据层的读写分离和负载均衡,希望能够在实际的应用中能够帮助到各位小伙伴。 下期我们将继续分享go语言的系...

IT干货栈
今天
10
0
OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
650
10
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部