zoukankan      html  css  js  c++  java
  • 通过Callable接口创建线程

    通过Callable接口创建线程

    一、前言

      Java中创建线程的方式有四中,前两种在前面我已经详细介绍过了(Runnable和Thread),不清楚的朋友们可看这里:

      Java多线程之线程的启动以及Java多线程之Runnable与Thread,至于最后一种创建线程的方式我会在后续的博文中做详细介绍,详情可关注我的博文。

      Java 5.0 在java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口

      Callable 接口类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是Runnable 不会返回结果,并且无法抛出经过检查的异常。

      Callable 需要依赖FutureTask ,FutureTask 也可以用作闭锁。

      此外,Callable是一个泛型接口,该接口只有一个方法:V call() throws Exception;该方法返回计算结果,如果无法计算结果,则抛出一个异常。

    二、代码示例

     1 package me.concurrrent.callable;
     2 
     3 import java.util.concurrent.Callable;
     4 import java.util.concurrent.ExecutionException;
     5 import java.util.concurrent.FutureTask;
     6 
     7 /**
     8  * 一、创建执行线程的方式三:实现 Callable 接口。 相较于实现 Runnable 接口的方式,方法可以有返回值,并且可以抛出异常。
     9  * 
    10  * 二、执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。 FutureTask 是 Future 接口的实现类
    11  */
    12 public class TestCallable {
    13 
    14     public static void main(String[] args) {
    15     ThreadDemo td = new ThreadDemo();
    16 
    17     // 1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。
    18     FutureTask<Integer> result = new FutureTask<>(td);
    19 
    20     new Thread(result).start();
    21 
    22     // 2.接收线程运算后的结果
    23     try {
    24         Integer sum = result.get(); // FutureTask 可用于闭锁
    25         System.out.println(sum);
    26         System.out.println("------------------------------------");
    27     } catch (InterruptedException | ExecutionException e) {
    28         e.printStackTrace();
    29     }
    30     }
    31 
    32 }
    33 
    34 class ThreadDemo implements Callable<Integer> {
    35 
    36     @Override
    37     public Integer call() throws Exception {
    38     int sum = 0;
    39 
    40     for (int i = 0; i <= 100000; i++) {
    41         sum += i;
    42     }
    43 
    44     return sum;
    45     }
    46 
    47 }
    48 
    49 /*
    50  * class ThreadDemo implements Runnable{
    51  * 
    52  * @Override public void run() { }
    53  * 
    54  * }
    55  */

      执行结果:

      705082704
      ------------------------------------

    如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
    如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
    如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。

    转载请注明出处和链接地址,欢迎转载,谢谢!

  • 相关阅读:
    深入理解JavaScript系列(45):代码复用模式(避免篇)
    深入理解JavaScript系列(38):设计模式之职责链模式
    深入理解JavaScript系列(43):设计模式之状态模式
    认识js中的function和this
    深入理解JavaScript系列(29):设计模式之装饰者模式
    javascript的内存分配
    详细解读Jquery各Ajax函数
    javascript 杂谈之哪种写法你更喜欢?
    深入理解JavaScript系列(28):设计模式之工厂模式
    深入理解JavaScript系列(30):设计模式之外观模式
  • 原文地址:https://www.cnblogs.com/albertrui/p/8401345.html
Copyright © 2011-2022 走看看