Android多线程的研究(8)——Java5于Futrue获取线程返回结果

我们先来看看ExecutorService操作的方法:

Android多线程的研究(8)——Java5于Futrue获取线程返回结果

在上一篇中我们使用了execute方法启动线程池中的线程运行,这一篇我们来看看submit方法的使用:submit提交一个返回值的任务用于运行,返回一个表示任务的未决结果的 Future。

该 Future 的 get 方法在成功完毕时将会返回该任务的结果。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableAndFutrue {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ExecutorService threadPool = Executors.newSingleThreadExecutor();
		Future<String> future = threadPool.submit(new Callable<String>() {

			@Override
			public String call() throws Exception {
				Thread.sleep(2000);
				return "阳光小强";
			}
			
		});
		
		System.out.println(future.get());
	}
}
在上面代码中我们启动了一个线程,休眠了2秒后返回结果“阳光小强"

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableAndFutrue {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ExecutorService threadPool = Executors.newSingleThreadExecutor();
		Future future = threadPool.submit(new Runnable(){
			
			@Override
			public void run() {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		
		System.out.println(future.get());
	}
}
提交一个 Runnable 任务用于运行。并返回一个表示该任务的 Future。该 Future 的 get 方法在成功 完毕时将会返回 null

再看看最后一个submit。能够加入一个result,当线程运行完毕后会返回该result

		Future future = threadPool.submit(new Runnable(){
			
			@Override
			public void run() {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}, "阳光小强");
假设我们提交多个任务(也就是开启多个线程)后怎样有序的返回结果呢?

Android多线程的研究(8)——Java5于Futrue获取线程返回结果

将生产新的异步任务与使用已完毕任务的结果分离开来的服务。

生产者 submit 运行的任务。使用者 take 已完毕的任务,并依照完毕这些任务的顺序处理它们的结果。比如。CompletionService 能够用来管理异步 IO ,运行读操作的任务作为程序或系统的一部分提交,然后。当完毕读操作时。会在程序的不同部分运行其它操作。运行操作的顺序可能与所请求的顺序不同。

通常。CompletionService 依赖于一个单独的 Executor 来实际运行任务。在这样的情况下。CompletionService 仅仅管理一个内部完毕队列。ExecutorCompletionService 类提供了此方法的一个实现。

Android多线程的研究(8)——Java5于Futrue获取线程返回结果

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CallableAndFutrue {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ExecutorService threadPool = Executors.newFixedThreadPool(10);
		ExecutorCompletionService<Integer> ecs = new ExecutorCompletionService<>(threadPool);
		for(int i=0; i<10; i++){
			final int seq = i;
			ecs.submit(new Callable<Integer>() {
				
				@Override
				public Integer call() throws Exception {
					Thread.sleep(new Random().nextInt(5000));
					return seq;
				}
			});
		}
		
		for(int i=0; i<10; i++){
			System.out.println(ecs.take().get());
		}
	}
}
Android多线程的研究(8)——Java5于Futrue获取线程返回结果





版权声明:本文博主原创文章,博客,未经同意不得转载。