指定线程执行的顺序---join()

线程T1,T2,T3分别启动,如何让其执行顺序变为T3>T2>T1:

线程1:

 1 package test6;
 2
 3 public class Thread1 extends Thread{
 4
 5     private Thread thread2;
 6     public Thread1(Thread thread2){
 7         this.thread2=thread2;
 8     }
 9     @Override
10     public void run(){
11         try {
12             thread2.join();
13             System.out.println("线程1在执行");
14         } catch (InterruptedException e) {
15             e.printStackTrace();
16         }
17     }
18 }

线程2:

 1 package test6;
 2
 3 public class Thread2 extends Thread{
 4
 5     private Thread thread3;
 6     public Thread2(Thread thread3){
 7         this.thread3=thread3;
 8     }
 9     @Override
10     public void run(){
11         try {
12             thread3.join();
13             System.out.println("线程2在执行");
14         } catch (InterruptedException e) {
15             e.printStackTrace();
16         }
17     }
18 }

线程3:

 1 package test6;
 2
 3 public class Thread3 extends Thread{
 4
 5     @Override
 6     public void run(){
 7         try {
 8             System.out.println("线程3在执行。。。");
 9             Thread.sleep(2000);
10         } catch (InterruptedException e) {
11             // TODO Auto-generated catch block
12             e.printStackTrace();
13         }
14     }
15 }

执行:

 1 package test6;
 2
 3 public class Run {
 4
 5     public static void main(String[] args) {
 6         Thread3 t3=new Thread3();
 7         Thread2 t2=new Thread2(t3);
 8         Thread1 t1=new Thread1(t2);
 9         t1.start();
10         t2.start();
11         t3.start();
12     }
13 }

如图:启动顺序为t1,t2,t3.但是使用join后,执行顺序为t3,t2,t1

join的作用:使当前线程等正在执行的线程执行完。join内部调用的是wait方法没,所以释放锁。sleep不释放锁。

时间: 2024-10-12 19:19:10

指定线程执行的顺序---join()的相关文章

Java主线程等待所有子线程执行完毕再执行解决办法集

Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,比如说主线程要返回一个响应用户的值,但这个值得赋值过程是由过个子线程来完成的(模拟一个实际开发的情景),所以主线程必须等待子线程执行完毕,再响应用户:否则,响应用户的是一个无意义的值. 那么如何确保所有的子线程执行完毕了.一般的有如下方法: 1  让主线程等待,或着睡眠几分钟.用Thread.sleep()或者TimeUnit.SECONDS.sleep(5); 如下: package andy.thread.tradit

Java多线程系列四——控制线程执行顺序

假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatch类:指定计数器,当计数器清零即取消阻塞 import java.util.concurrent.CountDownLatch; import org.junit.Assert; import org.junit.Test; /** * @Description: 规定线程次序的方法 */ publ

Thread的join的用法(线程执行排序)

此为转载解释: 线程必须要先start,才能join,只有启动了,才能对线程进行操作. 如有一个线程叫A,那么请看以下示例代码 A.start();   //启动A线程 A.join();   //邀请A线程先执行,本线程先暂停执行,等待A线程执行完后,主线程再接着往下执行 System.out.println("OK");   //这句话,要等到A线程执行完后,主线程获取到执行权后,才会被执行 具体例子: 代码段里,我把所有的join都注释掉了,输出的效果是 我把注释都打开join的

Java 线程同步执行(顺序执行)

关于线程,有两种实现方法, 一种是通过继承Runnable接口,另外一种通过扩展Thread类,两者的具体差别,可参考我找的这篇文章 http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html .本主主要是讲 线程的同步执行问题.. 如果程序是通过扩展Thread类的,网上的资料说可以通过 join()函数实现,但本人亲测,此法无法通过.程序如下: public class test1 extends Thread { pu

Junit指定测试执行顺序

原文链接: Test execution order原文日期: 2012年12月06日翻译日期: 2014年7月2日翻译人员: 铁锚 说明: Junit4.11版本及以后才支持,建议升级到最新版本. 按照设计原则,JUnit是不指定测试方法调用执行顺序的.目前为止,这些方法只是简单地按照反射(reflection) API返回的顺序执行.但是,使用JVM默认提供的排序是很不明智的,因为Java平台没有指定任何有规律的顺序,而事实上JDK 7可能会返回一个随机的顺序.当然,精心编写的测试代码之间并

Java多线程--让主线程等待所有子线程执行完毕 join

首先从公司一道笔试题开始 1 package test; 2 3 public class Test implements Runnable { 4 5 public int i = 0; 6 7 @Override 8 public void run() { 9 try { 10 Thread.sleep(1000); 11 } catch (InterruptedException e) { 12 // TODO Auto-generated catch block 13 e.printSt

关于for 循环里 线程执行顺序问题

最近在做项目时遇到了 这样的需求 要在一个for循环里执行下载的操作, 而且要等 下载完每个 再去接着走循环.上网查了一些 觉得说的不是很明确.现在把我用到的代码 贴上 希望可以帮到有此需求的开发者        private Handler mHandler = new Handler() {               public void handleMessage(android.os.Message msg) {                       switch (msg.

Java深入学习12:线程按目标顺序执行以及Lock锁和Condiiton接口

Java深入学习12:线程按目标顺序执行以及Lock锁和Condiiton接口 一.一个多线程问题,有三类线程,分别是A.B.C,如如实现ABCABCABCABCABC,顺次执行. 方案1.代码如下 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Thr

java主线程等待所有子线程执行完毕在执行(常见面试题)

java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功,下面就说一下我能想到的方法,欢迎大家批评指正: 用sleep方法,让主线程睡眠一段时间,当然这个睡眠时间是主观的时间,是我们自己定的,这个方法不推荐,但是在这里还是写一下,毕竟是解决方法 2.使用Thread的join()等待所有