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锁来实现类似功能


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

Android 价值千万的java线程专题:Wait&notify&join&Yield

创建线程的2种方式 1.实现Runnable接口的多线程例子 2.测试扩展Thread类实现的多线程程序   Thread有setName("MyThread");Runnable没有 clas...

java 线程协作 join方法

在实际开发中我们往往会遇到这样的情况一个线程的执行需要依赖另一个线程执行后的结果。即主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他...

浅谈Java线程启动与Thread.join()

java中线程的启动有两种方式: Java代码   class T extends Thread{      String name;      public T(String n...
  • WQ560
  • WQ560
  • 2013年07月10日 09:52
  • 610

Java线程中yield与join方法

Java线程调度的一点背景 在各种各样的线程中,Java虚拟机必须实现一个有优先权的、基于优先级的调度程序。这意味着Java程序中的每一个线程被分配到一定的优先权,使用定义好的范围内的一个正整数...

java基础线程-join()

package common; /** * Created by shao on 2016/11/3. */ public class ThreadTest implements Runnabl...

java线程join()方法分析

join()方法就是:当一个线程中调用另一个线程的join()方法时,当前线程会

JAVA线程中join方法可以强占CPU资源直至执行结束

好记性不如赖笔头…………join()方法在API中的说明:void join() 等待该线程死亡。 可以理解为当线程调用了这个方法时,它会强占CPU资源,直到线程执行结果为止。 ...

Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别

Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别  从操作...

[疯狂Java]多线程:线程控制(join、daemon、sleep、yield、优先级)

1. join——插入等待:     1) 可以在线程1中调用线程2的join方法,将线程2插入在线程1中,线程1必须等待线程2执行完后才会继续执行;     2) 看上去很像直接调用一个普通方法(把...

Java Thread.join()详解--父线程等待子线程结束后再结束

阅读目录 一、使用方式。二、为什么要用join()方法三、join方法的作用join四、用实例来理解打印结果:打印结果:五、从源码看join()方法 一、使用方式。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 线程 join
举报原因:
原因补充:

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