public interface Callable<V>    返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法

     public interface Future<V>      Future 表示异步计算的结果。计算完成后只能使用 get 方法来获取结果

1.线程处理返回结果

    一般开发中,使用多线程,最常见的就是:1.实现Runnable接口;2.继承Thread类。

    但是run方法是没有返回结果,很难满足我们的需求。这时,常用的办法就是实现Callable接口

    Callable接口提供了一个call方法入口,我们可以通过实现call方法,来执行任务;这个接口支持泛型,可以通过泛型参数,来获取想要的结果类型

  2.关闭线程池

    可以通过调用线程池的shutdown或shutdowNow方法来关闭线程池,但是它们的实现原理不同。

    shutdown的原理只是将线程池的状态设置SHUTDOWN状态,然后中断没有开始执行任务的线程。

    shutdownNow的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以需要注意一点,如果存在无法响应中断的任务,可能永远无法终止。shutdownNow会首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表

package com.yyx.test;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {

    private String name;

    public MyCallable(String name) {
this.name = name;
} @Override
public String call() throws Exception {
return name + "任务返回的内容";
} }
package com.yyx.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class CallableFutureTest {
public static void main(String[] args) {
try {
// 创建一个线程池
ExecutorService pool=Executors.newCachedThreadPool(); // 创建多个有返回值的任务
List<Future> listFuture=new ArrayList<Future>();
for(int i=1;i<=5;i++) {
Callable c = new MyCallable("第"+i + "个线程");
// 执行任务并获取Future对象
Future f = pool.submit(c);
//判断Future对象是否已经完成
if (f.isDone()) {
listFuture.add(f);
}
} // 关闭线程池
pool.shutdown(); // 获取所有并发任务的运行结果
for (Future future : listFuture) {
// 从Future对象上获取任务的返回值,并输出到控制台
System.out.println(">>>" + future.get().toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

最新文章

  1. Node.js学习笔记——Node.js开发Web后台服务
  2. 编译器开发系列--Ocelot语言4.类型定义的检查
  3. [Hadoop in Action] 第4章 编写MapReduce基础程序
  4. 【转】Thread.isBackground
  5. September 29th 2016 Week 40th Thursday
  6. 菜鸟学Linux命令:端口查看和操作命令
  7. Map的数据结构
  8. 数据库中is null(is not null)与=null(!=null)的区别
  9. Animator组件关闭再打开后参数丢失问题
  10. python 批量爬取代理ip
  11. sql server 2008 修改sa密码
  12. windows 7 ssh server for scp
  13. wan口mac=lan口mac加一,wlan是lan口mac加二
  14. __read_mostly变量含义
  15. 启用composer镜像服务
  16. RESTful 规范
  17. Kali学习笔记16:Nmap详细讲解
  18. 第一册:lesson ninety-three。
  19. redhat7.3安装python3 pip3
  20. JavaScript基础视频教程总结(021-030章)

热门文章

  1. 从顺序随机I/O原理来讨论MYSQL MRR NLJ BNL BKA
  2. Div 浮动到另一个div之上
  3. eclipse中通过search打开第二个文件时 第一个文件就自己关闭了
  4. apache一个IP绑定多个域名
  5. 3.【nuxt起步】-下面以一个SPA单页程序为例子
  6. linux内核I2C子系统学习(三)
  7. log4net菜鸟指南
  8. java设计模式之-建造者模式
  9. navicat小经验和快捷键
  10. vue2.0 自定义 提示框(Toast)组件