Java多线程(一)——Thread之join()方法

来源:互联网 发布:91上的是真的吗 知乎 编辑:程序博客网 时间:2024/05/18 03:04

线程Thread的join()方法能够将调用线程挂起(会释放锁并且不消耗CPU时间,区别于sleep)直到被调用join方法的线程执行结束。
查看JDK源码发现Thread的join方法内部是通过Object.wait实现的线程同步的。
主线程开启了T1、T2、T3三个线程,如何保证T2在T1执行完后执行,T3在T2执行完后执行?

public static void main(String[] args) throws Exception {        System.out.println(Thread.currentThread() + " test begin...");        final Thread t1 = new Thread(new Runnable() {            @Override            public void run() {                work(3000);//模拟耗时任务                System.out.println(Thread.currentThread()+ " exit");            }        });        t1.start();        final Thread t2 = new Thread(new Runnable() {            @Override            public void run() {                try {                    t1.join();//保证T2在T1执行完之后执行                } catch (InterruptedException e1) {                    e1.printStackTrace();                }                work(3000);                System.out.println(Thread.currentThread()+ " exit");            }        });        t2.start();        Thread t3 = new Thread(new Runnable() {            @Override            public void run() {                try {                    t2.join();//等待T2执行完毕                } catch (InterruptedException e) {                    e.printStackTrace();                }                work(3000);                System.out.println(Thread.currentThread()+ " exit");            }        });        t3.start();        t3.join();//主线程等待T3结束        System.out.println("Bye");    }    public static void work(long milliSeconds) {        try {            System.out.println(Thread.currentThread() + " doing work!");            Thread.sleep(milliSeconds);        } catch (InterruptedException e) {            System.out.println(Thread.currentThread() + " work exception...");            e.printStackTrace();        }    }

输出如下:

Thread[main,5,main] test begin...Thread[Thread-0,5,main] doing work...Thread[Thread-0,5,main] exitThread[Thread-1,5,main] doing work...Thread[Thread-1,5,main] exitThread[Thread-2,5,main] doing work...Thread[Thread-2,5,main] exitBye

稍微封装了下,如下:

//WorkThread.javapublic class WorkThread extends Thread {    long mWorkLoad;    Thread mRunAfterThread;    public WorkThread(long workLoad, Thread preThread) {        mWorkLoad = workLoad;        mRunAfterThread = preThread;    }    @Override    public void run() {        try {            if(mRunAfterThread != null) {                mRunAfterThread.join();//等待前一个线程执行结束            }            System.out.println(Thread.currentThread() + " doing work...");            Thread.sleep(mWorkLoad);        } catch (InterruptedException e) {            System.out.println(Thread.currentThread() + " work exception!");            e.printStackTrace();        }        System.out.println(Thread.currentThread() + " exit");    }}//测试代码public static void main(String[] args) throws Exception {        System.out.println(Thread.currentThread() + " test begin...");        WorkThread t1 = new WorkThread(3000, null);        WorkThread t2 = new WorkThread(3000, t1);//在t1之后执行        WorkThread t3 = new WorkThread(3000, t2);//在t2之后执行        t1.start();        t2.start();        t3.start();        t3.join();//主线程等待t3结束        System.out.println("Bye");    }
原创粉丝点击