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方法的区别

http://www.importnew.com/14958.html 长期以来,多线程问题颇为受到面试官的青睐。虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用...

Java线程中yield与join方法

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

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;   ...
  • WQ560
  • WQ560
  • 2013-07-10 09:52
  • 546

java线程join()方法分析

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

java基础线程-join()

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

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

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

Java多线程-线程状态、sleep()、yield()、join()

1、睡眠 Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。...

Java-----多线程小知识点:join()方法和守护线程

join()方法:当前线程需等待指定的线程结束后才能继续运行。该方法需要抛异常。 Example: 场景,老板约四个人打麻将。其中,老板是主线程,四个玩家是分线程。并且,要等待四个人全部到齐后才能...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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