Thread.join()的使用

来源:互联网 发布:1015357422的喜欢乐乎 编辑:程序博客网 时间:2024/06/06 20:19

用法
如果一个线程t1在另外一个线程t2上调用join方法,那么t1将被挂起,直到t2结束,t1才会执行任务。

一个简单例子

public class TestJoin implements Runnable {    public static void main(String[] args) throws InterruptedException {        Thread t = new Thread(new TestJoin());        long start = System.currentTimeMillis();        t.start();        t.join(1000);  //等待线程t执行1000毫秒在执行main线程        long end = System.currentTimeMillis();        long result = end - start;        System.out.println("cost time: " + result);        System.out.println("Main finished");    }    @Override    public void run() {        for (int i = 1; i <= 5; i++) {            try {                sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("睡眠: " + i);        }        System.out.println("TestJoin finished");    }}

执行结果:

cost time: 1001Main finished睡眠: 1睡眠: 2睡眠: 3睡眠: 4睡眠: 5TestJoin finished

主线程会让线程t执行1秒,之后main线程和t线程进行抢占式调用

join源码

 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;            }        }    }  public final void join() throws InterruptedException {        join(0);    }

查看源码发现其底层的实现为wait。上面的例子中当main线程调用t.join(),main线程将等待,t线程将获得1秒的执行时间

原创粉丝点击