您的位置:首页 > 编程语言 > Java开发

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

2017-09-11 14:35 363 查看
线程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] exit
Thread[Thread-1,5,main] doing work...
Thread[Thread-1,5,main] exit
Thread[Thread-2,5,main] doing work...
Thread[Thread-2,5,main] exit
Bye


稍微封装了下,如下:

//WorkThread.java
public 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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: