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执行完后执行?
输出如下:
稍微封装了下,如下:
查看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"); }
相关文章推荐
- Java多线程学习 (二) Thread的join()方法
- Java多线程 之 Thread子类 join方法(五)
- Java的多线程:Thread类的Join()方法
- Java 多线程中 Thread类 join方法的使用
- Java多线程中join方法的理解(对Thread.join讲解的很详细)
- java多线程中的join方法详解
- java例程练习(多线程——join()方法)
- Java多线程 Thread 方法
- 初学Java多线程:join方法的使用
- Java Thread Join方法
- java多线程系列_join方法的使用(5)
- java基本教程之join方法详解 java多线程教程
- java例程练习(多线程[join()方法])
- 转载:Java多线程中join方法的理解
- Java多线程中join方法的理解
- java创建多线程的两种方法(继承Thread类/实现Runnable接口)
- java谜题--Thread.join()方法容易忽略的地方
- 学习java多线程的笔记1--Thread(Runnable t)与重写run()方法等
- java基础学习__多线程(停止线程,守护线程,join方法)
- java 三种多线程的创建方法Thread,Handler,Runnable