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


    我们先来看一下ExecutorService中的执行方法:


    在上一篇中我们使用了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();
    				}
    			}
    		}, "阳光小强");
    如果我们提交多个任务(也就是开启多个线程)后如何有序的返回结果呢?

    将生产新的异步任务与使用已完成任务的结果分离开来的服务。生产者 submit 执行的任务。使用者 take 已完成的任务,并按照完成这些任务的顺序处理它们的结果。例如,CompletionService 可以用来管理异步 IO ,执行读操作的任务作为程序或系统的一部分提交,然后,当完成读操作时,会在程序的不同部分执行其他操作,执行操作的顺序可能与所请求的顺序不同。

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

    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());
    		}
    	}
    }
    






  • 相关阅读:
    mysql 导入报错(ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_E)
    Docker容器开机自动启动
    linux 查看内存条详情命令
    Linux 网络性能测试工具 iperf 的安装和使用
    redis基准性能测试
    pmm的安装,这里推荐下载官方提供的脚本,直接执行这个脚本就可以完成安装
    mysqlslap压力测试时出现"Can't connect to MySQL server"
    Linux监控工具介绍系列——iostat
    提高RabbitMQ的File descriptors
    python 打包
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468915.html
Copyright © 2020-2023  润新知