java 线程 join

原创 2017年02月16日 21:52:49

先给大家一个简单的需求,A B C D四个线程,要求按照顺序依次输出A B C D,

楼主第一时间想到了线程相关的join,给其中A的代码,其他相似

接下来对线程代码进行测试 



Thread a = new Thread(){
    @Override
    public void run() {
        try {
            Thread.sleep((long)(Math.random()*10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("A");
    }
};
a.start();
//a.join();
b.start();
//b.join();
c.start();
//c.join();
d.start();
//d.join();

测试结果跟预期想的一样,因为线程的执行顺序不确定,导致结果并不是想要的。因此打算加join方法到对应的线程对象上。分析join源码发现

public final void join() throws InterruptedException {
    join(0);
}

public final synchronized void join(long millis)
throws InterruptedException {
    long base = System.currentTimeMillis();
    long now = 0;

    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
        while (isAlive()) {
            wait(0);
        }


join方法 synchronized修饰,即同步的是对象,那创建的4个线程应该是无法做到同步等待的,  核心代码就是while(isAlive()){wait(0)} 这个方法,

/**
 * Tests if this thread is alive. A thread is alive if it has
 * been started and has not yet died.
 *
 * @return  <code>true</code> if this thread is alive;
 *          <code>false</code> otherwise.
 */
public final native boolean isAlive();

线程源码中对isAlive方法有详细说明,while(isAlive()){wait(0)}的作用就是 当某个线程没有进入死亡状态的话,这个线程会一直执行wait(0) 这个方法直到线程挂掉。

     在使用join方法一定要注意join的逻辑,保证其线程没有死亡的状态下进行join操作!!!


感兴趣的同学可以用Lock锁来实现类似功能


版权声明:本文为博主原创文章,未经博主允许不得转载。

java线程中yield()和join()的区别

多线程在面试中是非常受欢饮的题目,我个人认为我们很少有机会能够真正的用到复杂的多线程(我在7年前使用过一次),熟悉这些概念能够增加你的信心,先前,我已经讨论了一个相似的问题,wait()和sleep(...
  • maoyeqiu
  • maoyeqiu
  • 2015年12月08日 11:26
  • 1485

Java线程join()方法的用处,多线程同步

一、使用方式。 join是Thread类的一个方法,启动线程后直接调用,例如: 1 Thread t = new AThread(); t.start...
  • cao478208248
  • cao478208248
  • 2014年04月18日 10:30
  • 1685

java多线程--join函数

1. join()介绍 join() 定义在Thread.java中。 join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。这句话可能有点晦涩,我们还是通过例子去理解: /...
  • wangxiaotongfan
  • wangxiaotongfan
  • 2016年06月23日 11:02
  • 1937

JAVA多线程 join() 方法详解及应用场景

在某些情况下,主线程创建并启动了子线程,如果子线程中需要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,如果主线程想等待子线程执行完毕后,获得子线程中的处理完的某个数据,就要用到join方法了...
  • liuyifeng1920
  • liuyifeng1920
  • 2016年11月17日 11:40
  • 3409

Java 等待多个子线程 join

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。 t.jo...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2016年02月19日 17:30
  • 1256

【java关键字-Thread】Thread.Join()的用法,及其实现线程顺序执行的原理

其实Join方法实现是通过wait(小提示:Object 提供的方法)。 当main线程调用t.join时候,main线程会获得线程对象t的锁(wait 意味着拿到该对象的锁),调用该对象的wait(...
  • claram
  • claram
  • 2015年08月25日 23:23
  • 6728

关闭超时的java线程 --利用join和interrupt方法

httpclient中就提供了这样一个class- timeoutcontroller(位于org.Apache.commons.httpclient.util包内)查看该class的源代码可知其实现...
  • chaosllgao
  • chaosllgao
  • 2009年05月26日 14:32
  • 1248

Java的线程的join()方法

Java的线程的join()方法Java的线程的join()方法是让当前的线程进入Blocked/Waiting状态,让调用该join()的Thread对象执行完毕后,才让当前线程进入Runnable...
  • u010999240
  • u010999240
  • 2015年09月13日 23:35
  • 240

JAVA -- 线程sleep()和yield()、join()方法区别

1、sleep()方法       在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 让其他线程有机会继续执行,但它并不释放对象锁。也就是如果...
  • u010286334
  • u010286334
  • 2015年05月31日 12:02
  • 1330

Java线程join示例详解

Java线程的join方法可用于暂停当前线程的执行直至目标线程死亡。Thread中一共有三个join的重载方法。     public final void join():该方法将当前线程放入等待队列...
  • snarlfuture
  • snarlfuture
  • 2014年05月26日 23:03
  • 1316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 线程 join
举报原因:
原因补充:

(最多只允许输入30个字)