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. 每天一个linux命令:tail(16)

    tail tail命令用于输入文件中的尾部内容,不指定文件时,作为输入信息进行处理.tail命令默认在屏幕上显示指定文件的末尾10行.命令从指定点开始将文件写到标准输出,使用tail命令的-f选项可以 ...

  2. Fmx在android下InputBox输入框点击Cancel取消按钮后报异常

    在网上搜索半天也没有找到相关信息,估计遇到这个问题的相当少, 解决办法: 找到FMX.Dialogs.Android.pas, 将121行中  FValues[I] := FDefaultValues ...

  3. Optional常用操作

    1. 常见操作 @Test public void test1() { F f = new F(); // of(非null对象) Optional<F> fOptional = Opti ...

  4. 深度学习中的batch、epoch、iteration的含义

    深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看一遍, ...

  5. java 序列化机制

    package stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io ...

  6. CodeForces - 1051D (线性DP)

    题目:https://codeforces.com/problemset/problem/1051/D 题意:一个2行n列的矩形,上面有黑白块,然后问你怎么布置才能有k个连通块,问有多少种方案数 思路 ...

  7. .net core linux的守护进程 supervisor

    这个介绍的很全面,对初学者来说可以有更好的认识: https://www.cnblogs.com/savorboard/p/dotnetcore-supervisor.html

  8. 测开之路四十八:Django之重定向与cookie

    基础配置与上一篇一致 404错误 定义一个error页面 <!DOCTYPE html><html lang="en"><head> <m ...

  9. vue项目在IE下显示空白打不开问题

    近期遇到了项目是vue做的,在IE浏览器下打不开,显示空白问题,解决方案如下: 打不开的原因是因为少了babel-polyfill处理器,所以第一步需要下载: npm install babel-po ...

  10. Java迭代器模式

    迭代器模式是Java和.Net编程环境中非常常用的设计模式.此模式用于以顺序方式访问集合对象的元素,而不需要知道其底层表示. 迭代器模式属于行为模式类别. 实现实例 在这个实例中,将创建一个Itera ...