一、此方法获得最先完成任务的结果,即Callable<T>接口中的call的返回值,在获得结果时,会中断其他正在执行的任务

示例代码:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; public class MyinvokeAny { public static void main(String[] args) {
// TODO 自动生成的方法存根
List<Callable<String>> list=new ArrayList<Callable<String>>();
list.add(new MyCallable_iAny1());
list.add(new MyCallable_iAny2());
ExecutorService executor=Executors.newCachedThreadPool(); try {
String str=executor.invokeAny(list);//取出第一个执行完的任务时,其他未完成的任务会被中断
System.out.println(str);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (ExecutionException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} } }
class MyCallable_iAny1 implements Callable<String>{ @Override
public String call() throws Exception {
// TODO 自动生成的方法存根
try{
for(int i=0;i<123456;i++){
for(int j=0;j<123;j++){
if(Thread.currentThread().isInterrupted()){
System.out.println("this is a exception");
throw new InterruptedException("A InterruptedException");
}
}
}
}catch(Exception e){
e.printStackTrace();
throw e;
} System.out.println("finish");
return "call_1";
} }
class MyCallable_iAny2 implements Callable<String>{ @Override
public String call() throws Exception {
// TODO 自动生成的方法存根
Thread.sleep(1000);
return "call_2";
} }

  运行结果:

call_2java.lang.InterruptedException: A InterruptedException

this is a exception
at myexecutorservice.MyCallable_iAny1.call(myinvokeAny.java:53)
at myexecutorservice.MyCallable_iAny1.call(myinvokeAny.java:1)
at java.util.concurrent.FutureTask.run(Unknown Source)

  

二、异常的处理

对于会先完成,但会出现异常的任务,ExecutorService会将关注点换到下一个任务,若果所有的任务都出现异常,那么将会只获得最后一个任务的异常(例如,有3个任务A,B,C,这三个任务都会出现异常,但是只会获得C任务的异常)

示例代码:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; public class myinvokeAny { public static void main(String[] args) {
// TODO 自动生成的方法存根
List<Callable<String>> list=new ArrayList<Callable<String>>();
list.add(new MyCallable_iAny1());
list.add(new MyCallable_iAny2());
ExecutorService executor=Executors.newCachedThreadPool(); try {
String str=executor.invokeAny(list);//取出第一个执行完的任务时,其他未完成的任务会被中断 System.out.println(str);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (ExecutionException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} } }
class MyCallable_iAny1 implements Callable<String>{ @Override
public String call() throws Exception {
// TODO 自动生成的方法存根
Thread.sleep(2000); System.out.println("finish");
return "call_1";
} }
class MyCallable_iAny2 implements Callable<String>{ @Override
public String call() throws Exception {
// TODO 自动生成的方法存根
Thread.sleep(1000);
if(true){
throw new Exception("myException_B");
}
return "call_2";
} }

  运行结果:

finish
call_1

  由此,我们可以看出,MyCallable_iAny2任务出现异常,从而将任务的关注点移到了MyCallable_iAny1任务,并不会打印出异常信息。如果,想打印出异常信息,需要这样写:

写法一:

                try{
if(true){
throw new Exception("myException_B");
}
}catch(Exception e){
e.printStackTrace();

}

运行结果:

java.lang.Exception: myException_B
call_2
at myexecutorservice.MyCallable_iAny2.call(myinvokeAny.java:76)
at myexecutorservice.MyCallable_iAny2.call(myinvokeAny.java:1)

这里获得了异常任务的结果,这是因为MyCallable_iAny2的异常状态未上报,这导致线程池认为其是正确的,从而未将关注点换到下一个任务

写法二:

try{
if(true){
throw new Exception("myException_B");
}
}catch(Exception e){
// e.printStackTrace();
throw e;
}

运行结果:

finish
call_1

  这里抛出了异常,从了线程池将关注点换到了下一个任务

最新文章

  1. Java基础之集合与泛型
  2. 关于javaScript单线程的见解
  3. Effective Objective-C 2.0 — 第10条:在既有类中使用关联对象存放自定义数据
  4. 【剑指offer】题目20 顺时针打印矩阵
  5. Java学习-043-获取文件在目录中的路径
  6. UI3_UITableView
  7. iOS教你轻松打造瀑布流Layout
  8. linux内核--自旋锁的理解
  9. cloneNode小结
  10. 【bzoj1552】[Cerc2007]robotic sort
  11. 查找Oracle数据库中的重复记录
  12. Effective Java 第三版——12. 始终重写 toString 方法
  13. Linux下的压力测试工具:ab、http_load、webbench、siege
  14. C程序第二次作业
  15. Tag功能介绍—我们为什么打Tag?
  16. 手机端扫描证件识别SDK
  17. 沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版
  18. windows10局域网实现文件共享
  19. jmeter聚合报告导出时乱码的解决
  20. java学习-sha1散列算法

热门文章

  1. day017-------python 类与类的关系
  2. cmd命令窗口相关操作指南
  3. tornado 10 长轮询和 websocket
  4. [BZOJ 5330][SDOI2018] 反回文串
  5. 一款不错的Linux终端颜色设置
  6. 【算法笔记】B1046 划拳
  7. ansys 有限元自学手册
  8. 阿里Tree-based Deep Match(TDM) 学习笔记
  9. python 爬虫系列06--古诗文
  10. (转)shell实现多级菜单脚本编写