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

  

  

JavaSE---多线程---Callable、Future的更多相关文章

  1. 多线程-Callable、Future、FutureTask

    我们普遍知道的创建线程的方式有两种,一种是继承Thread,一种是实现Runnable接口.这两种方式都无法获取任务执行完后的结果,并发包提供了Callable 类能够得到任务执行完的结果. 为何需要 ...

  2. Java线程池(Callable+Future模式)

    转: Java线程池(Callable+Future模式) Java线程池(Callable+Future模式) Java通过Executors提供四种线程池 1)newCachedThreadPoo ...

  3. 13.多线程设计模式 - Future模式

    多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...

  4. Java 并发编程——Callable+Future+FutureTask

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  5. 12 Callable & Future & FutureTask

    创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用 ...

  6. java 并发runable,callable,future,futureTask

    转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html package future_call; import java.util.concurre ...

  7. 多线程设计模式 - Future模式

    Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...

  8. Java Callable Future Example(java 关于Callable,Future的例子)

    Home » Java » Java Callable Future Example Java Callable Future Example April 3, 2018 by Pankaj 25 C ...

  9. Java并发编程:ThreadPoolExecutor + Callable + Future(FutureTask) 探知线程的执行状况

    如题 (总结要点) 使用ThreadPoolExecutor来创建线程,使用Callable + Future 来执行并探知线程执行情况: V get (long timeout, TimeUnit ...

  10. Java多线程 - Callable和Future

    已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...

随机推荐

  1. shell中的双引号和单引号

    参考链接:http://bbs.chinaunix.net/thread-2076396-1-1.html " "(双引号)与 ' '(单引号)的区别 你在shell prompt ...

  2. UIView响应事件的两个方法

    参考自:https://blog.csdn.net/mushaofeng1990/article/details/62434349 用户触摸屏幕后的事件传递过程: //方法A-(UIView *)hi ...

  3. operator函数操作符

    函数操作数() 可以实现将对象当函数使用. class Square{ public: double operator()(double x)const{return x*x;} };

  4. Golang操作MySQL的正确姿势

    封装原因: 查看了很多网上提供的ORM类型的数据库操作,觉得比较麻烦,需要提前配置很多的表结构体,然后才能使用,对于数据表很多的项目就配置起来就比较麻烦,所以对golang的mysql包进行了外层包装 ...

  5. 2018-2019-2 20175213实验四 《Android开发基础》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:吕正宏 学号:20175213 指导教师:娄嘉鹏 实验日期:2019年5月14日 实验时间:13:45 - 21:00 实验序号:实验 ...

  6. HBase–RegionServer宕机恢复原理

    Region Server宕机总述 HBase一个很大的特色是扩展性极其友好,可以通过简单地加机器实现集群规模的线性扩展,而且机器的配置并不需要太好,通过大量廉价机器代替价格昂贵的高性能机器.但也正因 ...

  7. PAT_A1074#Reversing Linked List

    Source: PAT A1074 Reversing Linked List (25 分) Description: Given a constant K and a singly linked l ...

  8. BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)

    原生的 Bootstrap 的 carousel.js 插件并没有支持手势,有下面3种解决方案 : 1. jQuery Mobile (http://jquerymobile.com/download ...

  9. C语言|博客作业6

    一.本周教学内容&目标 第3章 分支结构 3.1-3.2 使学生熟悉多分支结构.字符型数据类型和逻辑运算符. 二.本周作业头 问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求 ...

  10. 重定向和转向的写法,重定向以post方式提交

    重转向保留跳转过来的Referer,路径不会变1 request.getRequestDispatcher("/eventweb/index.sp?loginId=" + logi ...