• 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 }
    作者:donleo123
    本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。
  • 相关阅读:
    [C]recursion递归计算阶乘
    [Python]reduce function & lambda function & factorial
    [C/JAVA] ceil, floor
    OC项目调用C++
    Xcode 代码注释
    百度云加速器
    UITableView和MJReFresh结合使用问题记录
    OC 类的load方法
    JLRoutes笔记
    推送通知项目记录
  • 原文地址:https://www.cnblogs.com/donleo123/p/14069836.html
Copyright © 2020-2023  润新知