java面试题:如何让三个子线程执行完,再执行主线程

让三个子线程执行完再执行主线程的三种实现方式

方法一:利用CountDownLatch

	public class CountDownLatchTest {
		public static void main(String[] args) {
			final CountDownLatch latch = new CountDownLatch(10);
			LatchDemo ld = new LatchDemo(latch);
			for (int i = 0; i < 10; i++) {
				new Thread(ld).start();
			}
	
			try {
				latch.await();//让主线程等待多个执行完后(即latch变为)再执行
			} catch (InterruptedException e) {
			}
			System.out.println("主线程执行" );
		}
	
	}
	
	class LatchDemo implements Runnable {
		//多线程需共享latch
		private CountDownLatch latch;
		public LatchDemo(CountDownLatch latch) {
			this.latch = latch;
		}
	
		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()+"执行结束");
			latch.countDown();
		}
	
	}

方法二:利用join方法

	public class JoinTest {
	    public static void main(String[] args) {
	        ThreadDemoJ td = new ThreadDemoJ();
	        try {
	            Thread thread1 = new Thread(td);
	            Thread thread2 = new Thread(td);
	            Thread thread3 = new Thread(td);
	            thread1.start();
	            thread2.start();
	            thread3.start();
	            //让三个线程执行完,如果在调用start方法后面直接调用join方法,那么三个线程将串行
	            thread1.join();
	            thread2.join();
	            thread3.join();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        System.out.println("主线程结束执行");
	    }
	    
	}
	
	class ThreadDemoJ implements Runnable{
	    @Override
	    public void run() {
	        try {
	            System.out.println(Thread.currentThread().getName()+"执行");
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }
	}

注意:

join():等待该线程结束,后面的语句一定会等待该线程结束才执行,该方法有三个有两个有参的重载方法

join(long millis):等待该线程millis 毫秒,不管该线程是否执行结束,后面的语句都开始执行

join(long millis, int nanos):等待该线程millis+nanos 毫秒,不管该线程是否执行结束,后面的语句都开始执行

后面两个方法是不一定等待该线程执行完的。


方法三:利用Callable接口和FutureTask

	public class CallableTest {
		public static void main(String[] args) {
			ThreadDemoCa td = new ThreadDemoCa();
			
			//1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。
			FutureTask<Integer> result1 = new FutureTask<>(td);
			FutureTask<Integer> result2 = new FutureTask<>(td);
			FutureTask<Integer> result3 = new FutureTask<>(td);
			
			new Thread(result1).start();
			new Thread(result2).start();
			new Thread(result3).start();
			try {
			    result1.get();
			    result2.get();
			    result3.get();
			    //2.接收所有线程运算后主线程才执行
				System.out.println("主线程执行");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	
	}
	
	class ThreadDemoCa implements Callable<Integer>{
	
		//需要实现call()方法
		@Override
		public Integer call() throws Exception {
		    System.out.println(Thread.currentThread().getName()+"执行结束");
			return 1;
		}
		
	}

博主为新手,如有不对请指出,谢谢!
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值