通过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】。转载请注明出处和链接地址,欢迎转载,谢谢!