java多线程创建方式三Callable

在前面我们讲述了建立线程的2种体例,一种是直接担当Thread,别的一种就是实现Runnable接口。

  这2种体例都有一个缺陷就是:在执行完使命之后无法获取执行成果。

  若是需要获取执行成果,就必需经由过程共享变量或者利用线程通信的体例来达到结果,这样利用起来就比力麻烦。

  而自从Java 1.5起头,就供给了Callable和Future,经由过程它们可以在使命执行完毕之后获得使命执行成果。

  今天我们就来会商一下Callable、Future和FutureTask三个类的利用方式。以下是本文的目次纲领:

  一.Callable与Runnable

  二.Future

  三.FutureTask

工具/原料

  • 电脑
  • intellij IDEA

方式/步骤

  1. 1

    建立一个实现callable的实现类

    具体代码如下所示:

    import java.util.concurrent.Callable;

    import java.util.concurrent.ExecutionException;


    /**

     * 建立线程的体例三:实现callable接口 --》jdk5.0新增

     */


    // 1、建立一个实现callable的实现类

    public class NumThread implements Callable<Integer> {


    private int length;


    public void setLength(int length) {

    this.length = length;

    }


    // 2、实现call方式,将此线程需要执行的操出声明在call方式中

    public Integer call() throws Exception {


    int sum = 0;

    for (int i = 0; i <= length; i++) {


    if (i % 2 == 0) {

    sum += i;

    System.out.println(i);

    }

    }

    return sum;

    }

    }

  2. 2

    编写测试类

    代码如下所示:

    import java.util.concurrent.FutureTask;

    public class ThreadNew {


    public static void main(String[] args) {

    // 3、建立callable实现类的对象

    NumThread numThread = new NumThread();

    // 3.1 传参数

    numThread.setLength(100);


    // 4、将此callable实现类的对象作为参数传递到FutureTask的机关器中,建立FutureTask对象

    FutureTask<Integer> integerFutureTask = new FutureTask<Integer>(

    numThread);

    // 5、将FutureTask作为参数传递Thread机关器中,建立Thread对象,并挪用start方式

    new Thread(integerFutureTask).start();

    try {

    // 6、获取Callable中call方式中的返回值

    // get()返回值即为futureTask机关器参数Callable实现类重写的call的返回值

    Integer sum = integerFutureTask.get();

    System.out.println("总计:" + sum);

    } catch (InterruptedException e) {

    e.printStackTrace();

    } catch (ExecutionException e) {

    e.printStackTrace();

    }


    }

    }

  3. 3

    代码详解:

    1、相较于Thread和Runable实现多线程的体例其可以获取线程执行的返回值

    2、在NumThread 中的以下代码是按照set方式体例标的目的callable实现类中传参数,然后再call方式中利用。

    private int length;


    public void setLength(int length) {

    this.length = length;

    }

  4. 4

    测试

    运行代码

  5. 5

    总结:

    如何理解实现callable接口的体例建立多线程比实现Runable接口建立线程的体例壮大?

      1、call() 可以返回肆意值

      2、call() 可以抛出异常,被外面的操作捕捉,获取异常的信息

      3、Callable是撑持泛型的

注重事项

  • jdk 1.8 intellij IDEA 2018
  • 发表于 2019-08-03 23:25
  • 阅读 ( 240 )
  • 分类:其他类型

相关问题

0 条评论

请先 登录 后评论