1、实现Callable接口
1 package com.cn.donleo.thread.impl;
2
3 import java.util.concurrent.Callable;
4
5 /**
6 * @author liangd
7 * date 2020-10-31 15:30
8 * code
9 */
10 public class MyThreadByCallable implements Callable<Integer> {
11
12 private int i = 0;
13
14 @Override
15 public Integer call() throws Exception {
16 for (; i < 50; i++) {
17 System.out.println("第" + i + "个 MyThread: " + Thread.currentThread().getName());
18 }
19 return i;
20 }
21 }
2、测试类
1 package com.cn.donleo.thread.impl;
2
3 import java.util.concurrent.ExecutionException;
4 import java.util.concurrent.FutureTask;
5
6 /**
7 * @author liangd
8 * date 2020-10-31 15:35
9 * code 测试Callable
10 */
11 public class TestCallable {
12 /**
13 * 一、步骤
14 * 1、创建 Callable 接口的实现类,并实现 call 方法,该 call 方法会成为线程执行体,且 call 方法具有返回值,
15 * 在创建 callable 接口的实现类!
16 *
17 * 2、使用 FutrueTask 类来包装 Callable 对象,该 FutrueTask 封装类Callable的call方法的返回值
18 *
19 * 3、使用 FutrueTask 对象作为 Thread 的 target 创建并启动新线程!
20 *
21 * 4、使用 FutrueTask 的 get 方法获取执行结束后的返回值
22 *
23 * 二、实现runnable、callback接口与继承thread类的优缺点
24 *
25 * 采取 Runnable、Callable 的优势在于——线程类只是实现了Runnable 或 Callable 接口,还可以继承其它类;
26 * 在这种方法下,多个线程可以共享一个 target 对象,因此非常适合多个相同线程处理同一份资源的情况,
27 * 从而将 CPU、代码和数据分开,形参清晰的模型,体现了面对对象的编程思想。劣势在于编程复杂度略高。
28 *
29 * @param args
30 */
31 public static void main(String[] args){
32 MyThreadByCallable callable = new MyThreadByCallable();
33 FutureTask<Integer> futureTask = new FutureTask<>(callable);
34 Thread thread1 = new Thread(futureTask,"线程1");
35 thread1.start();
36
37 try {
38 System.out.println(futureTask.get());
39 } catch (InterruptedException | ExecutionException e) {
40 e.printStackTrace();
41 }
42 }
43 }