004 利用Callable的返回阻塞来等待一组线程的执行完毕

1、场景阐述;

在某些情况下,需要获得一组线程的结果,给调用端。例如在Controller的某个请求方法中,执行了n个线程,需要将这n个线程的结果都响应给请求。

2、方案设计;

利用Callable的返回阻塞,来等待这n个线程的执行完毕,然后将这n个线程的结果响应回去;其执行时间,基本上取决于最耗时的那个线程。

3、具体代码;

public class ReturnSameTime {
	
	private static class CallableTest implements Callable{
		@Override
		public Integer call() throws Exception {
			return 1;
		}
	}
	
	private static class CallableTest2 implements Callable{
		@Override
		public Integer call() throws Exception {
			Thread.sleep(10*1000);
			return 2;
		}
	}
	
	private static class CallableTest3 implements Callable{
		@Override
		public Integer call() throws Exception {
			Thread.sleep(2*1000);
			return 3;
		}
	}
	
	public static void main(String[] args) throws Exception {
		
		Callable a = new CallableTest();
		Callable b = new CallableTest2();
		Callable c = new CallableTest3();
		
		FutureTask aTask = new FutureTask(a);
		FutureTask bTask = new FutureTask(b);
		FutureTask cTask = new FutureTask(c);
		
		new Thread(aTask).start();
		new Thread(bTask).start();
		new Thread(cTask).start();
		
		int num1 = aTask.get();
		System.out.println(num1);
		int num2 = bTask.get();
		System.out.println(num2);
		int num3 = cTask.get();
		System.out.println(num3);
		System.out.println("==================");
		int result = num1 + num2 + num3;
		
		System.out.println(result);
	}
}

4、分析;

1)xTask.get()方法会阻塞,直至xTask任务代表的线程返回了结果;

2)aTask.get()、bTask.get()、cTask.get()会顺序执行,从而达到这三个线程执行完毕后再向客户端响应;

5、其它;

Controller的某个请求方法中,执行了n个线程,需要将这n个线程的结果都响应给请求。这是假设的一种场景,建议是,具体业务尽量不要设计成这个样子。

你可能感兴趣的:(Java线程,Callable的返回阻塞,等待一组线程的执行完毕)