快速业务通道

深入浅出Java多线程(1)-方法join - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
f <code>0</code> means to wait forever.    *    * @param   millis  the time to wait in milliseconds.    * @exception InterruptedException if any thread has interrupted    *       the current thread. The <i>interrupted status</i> of the    *       current thread is cleared when this exception is thrown.    */    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);      }    } else {      while (isAlive()) {      long delay = millis - now;      if (delay <= 0) {        break;      }      wait(delay);      now = System.currentTimeMillis() - base;      }    }    }

深入浅出Java多线程(1)-方法join(3)

时间:2010-12-09 advincenting

其实Join方法实现是通过wait(小提示:Object 提供的方法)。 当main线 程调用t.join时候,main线程会获得线程对象t的锁(wait 意味着拿到该对象的 锁),调用该对象的wait(等待时间),直到该对象唤醒main线程,比如退出后。

这就意味着main 线程调用t.join时,必须能够拿到线程t对象的锁,如果拿 不到它是无法wait的,刚开的例子t.join(1000)不是说明了main线程等待1秒, 如果在它等待之前,其他线程获取了t对象的锁,它等待时间可不就是1毫秒了。 上代码介绍:

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package concurrentstudy; /** * * @author vma */ public class JoinTest {    public static void main(String[] args) {      Thread t = new Thread(new RunnableImpl());     new ThreadTest(t).start();      t.start();      try {        t.join();        System.out.println("joinFinish");      } catch (InterruptedException e) {        // TODO Auto-generated catch block        e.printStackTrace();      }    } } class ThreadTest extends Thread {    Thread thread;    public ThreadTest(Thread thread) {      this.thread = thread;    }    @Override    public void run() {      holdThreadLock();    }    public void holdThreadLock() {      synchronized (thread) {        System.out.println("getObjectLock");        try {          Thread.sleep(9000);        } catch (InterruptedException ex) {        ex.printStackTrace();        }        System.out.println("ReleaseObjectLock");      }    } } class RunnableImpl implements Runnable {    @Override    public void run() {      try {        System.out.println("Begin sleep");        Thread.sleep(2000);       System.out.println("End sleep");      } catch (InterruptedException e) {        e.printStackTrace();      }    } }

在main方法中 通过new ThreadTest(t).start();实例化ThreadTest

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号