Java实现多线程的三种方式(3) ------实现Callable<V>接口

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 }

 

posted @ 2020-12-01 18:00  donleo123  阅读(365)  评论(0编辑  收藏  举报