我们先来看一下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());
}
}
}

最新文章

  1. QT5之三大重要窗体
  2. CentOS 安装 gcc-c++
  3. Netbeans 8.0.2 For PHP继续坑
  4. splunk 索引过程
  5. -_-#【Better Code】
  6. 多用pip,少用easy_install。
  7. JavaScript-学习一_var
  8. MSSQL BACKUP WEBSHELL
  9. jq原创弹出层折叠效果
  10. windows/linuxjdk安装,jdk1.6升级到1.7
  11. jvm005 从jvm的角度谈谈线程的实现
  12. 解析 Javascript - this
  13. .NET知识体系(转载)
  14. vue--js里跳转页面
  15. 表单之input的样式修改
  16. Python多进程库multiprocessing中进程池Pool类的使用[转]
  17. 腾讯云服务器部署FTP
  18. windows10下使用source insight出现&quot;source insight program editor已停止工作&quot;的问题
  19. python基础学习1 -异常捕获
  20. navicat连接mysql出现1251错误

热门文章

  1. ABAP调用外部WebService
  2. js---26组合模式
  3. thinkphp5 left join
  4. 第6章4节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
  5. android:一个Open键引发的问题!!
  6. BeautifulSoup的高级应用 之 contents children descendants string strings stripped_strings
  7. ORACLE10g R2【单实例 FS→单实例FS】
  8. session 、cookie、token的区别及联系
  9. ACCESS数据库改名asp或asa
  10. Java Web学习总结(18)——JSP标签