java再复习-Future与Callable的使用

Future总是与Callable绑着使用的。

callable接口:相当于Runnable,但是被线程执行后可以提供返回值。

future接口:用来保存Callable的返回值的。

所以他俩是结合使用的

Future常用子类:

FutureTask,一个保存Callable接口返回值的任务,使用:

public class FutureAndCallableDemo {

	public static void main(String[] args) throws Exception, ExecutionException {
		FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {

			@Override
			public String call() throws Exception {
				//执行耗时操作,在子线程中
				Thread.sleep(2000);
				return "json数据";
			}
		});
		
		//开启线程去执行
		new Thread(futureTask).start();
		System.out.println("我还可以先干点其他事..");
		System.out.println("拿到结果.." + futureTask.get());
	}
	
}

另一种方式:

public class FutureAndCallableDemo {

	public static void main(String[] args) throws Exception, ExecutionException {
	
		Future<String> submit = Executors.newSingleThreadExecutor().submit(new Callable<String>() {

			@Override
			public String call() throws Exception {
				Thread.sleep(2000);
				return "数据";
			}
		});
		
		System.out.println(submit.get());
	}
	
}

几乎所有的线程池都可以submit callable接口对象,并且返回Future接口对象。

public class FutureAndCallableDemo {

	public static void main(String[] args) throws Exception, ExecutionException {
		//创建线程池
		ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(10);
		//使用CompletionService包装线程池,以便批量保存Callable返回结果
		CompletionService<String> completionService = new ExecutorCompletionService<>(newFixedThreadPool);
		for(int i=0;i<10;i++){
			completionService.submit(new Callable<String>() {

				@Override
				public String call() throws Exception {
					int random = new Random().nextInt(10000);
					Thread.sleep(random);
					System.out.println("返回数据..." + random);
					return random + "";
				}
			});
		}
		
		for(int i=0;i<10;i++){
			//取到Future对象有take和poll两个方法,take代表如果没有Future就阻塞等待,而poll代表如果此时没有,则直接返回Null
			System.out.println("拿到数据..." + completionService.take().get());
		}
		
		newFixedThreadPool.shutdown();
	}
	
}
执行结果:

返回数据...1617
拿到数据...1617
返回数据...4514
拿到数据...4514
返回数据...4791
拿到数据...4791
返回数据...5134
拿到数据...5134
返回数据...5766
拿到数据...5766
返回数据...6440
拿到数据...6440
返回数据...6824
拿到数据...6824
返回数据...7807
拿到数据...7807
返回数据...8624
拿到数据...8624
返回数据...9616
拿到数据...9616




猜你喜欢

转载自blog.csdn.net/sinat_31311947/article/details/61416018