通过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】。

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

原文地址:https://www.cnblogs.com/albertrui/p/8401345.html