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"); }
阅读全文
0 0
- Java多线程(一)——Thread之join()方法
- Java多线程 之 Thread子类 join方法(五)
- java多线程—Thread.Join()和Thread.Sleep()
- JAVA——多线程编程之两种多线程方法:继承Thread类和实现Runnable接口(一)
- Java多线程学习 (二) Thread的join()方法
- Java 多线程之--- Thread.join介绍
- Java多线程之Thread(一)
- Java多线程中join方法的理解(对Thread.join讲解的很详细)
- java多线程之join()方法
- java多线程之join()方法
- (一)java多线程之Thread
- (一)java多线程之Thread
- Java中的线程Thread方法之---join()
- Java中的线程Thread方法之---join()
- Thread之join()方法
- Java Thread Join方法
- Java Thread.join()方法
- java Thread join方法
- 关于android中xml的radiobutton默认选中失效
- faster-rcnn处理图片格式
- maven请求报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
- java http请求和https请求
- The given object has a null identifier解决之法
- Java多线程(一)——Thread之join()方法
- Leetcode637. BFS计算二叉树每层节点的平均值
- 类加载机制实现Android热修复
- BIMserver使用文档
- Tomcat端口被占用
- Leetcode-N-Queens
- 【转】在CentOS6.5安装 svn1.8 (亲测可用)
- form表单提交中文乱码的详细解析
- 【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)