1、概述

    1.1  JDK1.5后,Java提供了Callable接口,该接口提供  一个call方法   作为  线程执行体,该call方法可以  有返回值、声明抛出异常;

          因此,我们可以直接将Callable接口作为target来创建线程,但是Callable接口是新增的接口,不是Runnable的实现类

                  JDK1.5后   又 提供了Future接口 代表  Callable接口的call()的  返回值

                并提供  Future接口的实现类FutureTask(该类实现了Runnable接口、Futrure接口,可以   作为Thread的target);

    1.2  创建、启动有返回值的线程

          1.2.1  创建Callable接口的实现类,实现call方法;

          1.2.2  创建实现类的实例,并用FutureTask进行封装;

          1.2.3  使用FutureTask的实例作为Thread的target创建Thread实例、调用start()开启线程;

          1.2.4  调用FutureTask实例的方法来获得子线程执行后的返回值;

package com.an;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class CallableImpl implements Callable {
/**
* 线程执行体
* @return
* @throws Exception
*/
public Object call() throws Exception {
int i=0;
for (;i<10;i++){ }
return i;
} public static void main(String[] args)throws Exception{
for (int i=0;i<30;i++){
System.out.println(Thread.currentThread().getName()+"="+i);
if (i==5){
FutureTask futureTask=new FutureTask(new CallableImpl());
Thread thread=new Thread(futureTask,"有返回值的线程");
thread.start();
thread.join();
System.out.println(futureTask.get());
}
} }
}

    1.3、FutureAPI

        

    1.4、实战

package com.an.thread.callable;

import java.util.concurrent.Callable;

/**
* @description:
* @author: anpeiyong
* @date: Created in 2020/1/18 10:33
* @since:
*/
public class MyTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("线程执行开始...");
int i=1/0;
return 1;
}
}

  

package com.an.thread.callableandfuture;

import java.util.concurrent.*;

/**
* @description:
* @author: anpeiyong
* @date: Created in 2020/1/18 10:34
* @since:
*/
public class Test { public static void main(String[] args) { // testManThread();
testThreadPool();
} /**
* 手动创建线程
*/
public static void testManThread(){
FutureTask<Integer> futureTask=new FutureTask<>(new MyTask());
new Thread(futureTask).start();
try {
int a=(Integer) futureTask.get();
System.out.println(a);
}catch (Exception e){
System.out.println("异常了:"+e);
}
} /**
* 线程池使用
*
*/
public static void testThreadPool(){
ThreadPoolExecutor executor=new ThreadPoolExecutor(10,10,20, TimeUnit.SECONDS,new ArrayBlockingQueue<>(10));
//-----------------第一种:自定义任务、线程池提交任务
// executor.submit() 只需要提交任务即可,无需FutureTask封装
// Future<Integer> future=executor.submit(new MyTask()); //-----------------第二种:不用自定义任务、线程池通过内部类提交任务
Future future=executor.submit(()->{
System.out.println("线程执行开始...");
int i=1/0;
return 1;
});
try {
int a=(Integer) future.get();
System.out.println(a);
}catch (Exception e){
System.out.println("异常了:"+e);
}finally {
executor.shutdown();
} }
}

  

  

最新文章

  1. 仿优酷Android客户端图片左右滑动(自动滑动)
  2. HTML:document.activeElement
  3. 通过KUDU获取Azure网站的日志
  4. 使用JMeter创建数据库(Mysql)测试
  5. 从printf(&quot;\40d\n&quot;)看转义字符
  6. 转:python类型转换、数值操作
  7. Django Navi 重用
  8. Webform——购物车
  9. python第五天
  10. Zookeeper的基本概念
  11. 04 Feasibility of Learning
  12. Open-Falcon第七步安装报警模块(小米开源互联网企业级监控系统)
  13. overlay 是如何隔离的?- 每天5分钟玩转 Docker 容器技术(53)
  14. Centos6.5-dnsmasq安装
  15. PLSQL基础知识-图片
  16. 如何在CentOS 7中安装最新Git(源码安装)
  17. sql 一列拼接成一行,再分割成列
  18. Highcharts X轴纵向显示
  19. python开发_自己开发的一个小游戏
  20. Django - 权限(5)- 非菜单权限对应的一级菜单展开、面包屑导航

热门文章

  1. pugixml的使用
  2. SpringBoot---概述
  3. php 系统函数
  4. selenium与appium怎样联系
  5. 从React Native到微服务,落地一个全栈解决方案
  6. Activator.CreateInstance with parameters
  7. mysql 查询结果增加自动递增的一列,排名,排序
  8. A Guide To using IMU (Accelerometer and Gyroscope Devices) in Embedded Applications.
  9. 信息安全-OAuth2.0:NuGetFromMicrosoft
  10. 在Windows及Linux下获取毫秒级运行时间的方法