• Callable 和 Runnable 异同


    Callable 和 Runnable 都可以作为任务去执行,异同点主要表现在以下几点

    • 1.Callable是一个接口需要实现call()方法,Runnable也是一个接口需要是实现run() 方法
    • 2.call()方法可以抛出异常,run()方法无法抛出异常,只能自行处理
    • 3.Callable类有泛型,在创建的时候可以传递进去,在实现call()方法的时候可以返回
    • 4.Callable执行任务的时候可以通过FutureTask知晓任务执行的状态以及结果(FutureTask的get()方法),Runnable无法知晓任务执行的状态以及结果.
    • 5.Runnable实例对象需要Thread包装启动,Callable实例对象需要先通过FutureTask包装再丢给Thread包装执行(FutrueTask对象本质还是Runnable),当然在线程池里不需要那么复杂.

    测试代码如下

     1 package learn.thread;
     2 
     3 import java.util.concurrent.Callable;
     4 import java.util.concurrent.FutureTask;
     5 
     6 public class CallableAndRunnable {
     7 
     8     public static void main(String[] args) {
     9         testCallable();
    10         testRunnable();
    11     }
    12 
    13     /**
    14      * 测试runnable
    15      */
    16     private static void testRunnable() {
    17         //创建执行对象
    18         Runnable r = new Runnable() {
    19             @Override
    20             public void run() {
    21                 System.out.println("当前线程名称是:" + Thread.currentThread().getName());
    22                 try {
    23                     Thread.sleep(2000L);
    24                 } catch (InterruptedException e) {
    25                     e.printStackTrace();
    26                 }
    27                 System.out.println("runnable 执行完毕");
    28             }
    29         };
    30         //包装对象
    31         Thread t = new Thread(r);
    32         //启动线程执行
    33         t.start();
    34     }
    35 
    36     /**
    37      * 测试callable
    38      */
    39     private static void testCallable() {
    40         //创建执行对象
    41         Callable<Result> ca = new Callable<Result>() {
    42             @Override
    43             public Result call() throws Exception {
    44                 System.out.println("当前线程名称是:" + Thread.currentThread().getName());
    45                 Thread.sleep(2000L);
    46                 return new Result("callable 执行完毕");
    47             }
    48         };
    49         //包装对象
    50         FutureTask<Result> ft = new FutureTask<Result>(ca);
    51         try {
    52             //启动线程执行
    53             new Thread(ft).start();
    54             //获取结果
    55             System.out.println(ft.get().getMsg());
    56         } catch (Exception e) {
    57             e.printStackTrace();
    58         }
    59     }
    60     
    61     /**
    62      * 返回实体
    63      */
    64     static class Result {
    65         private String msg;
    66 
    67         public Result() {
    68             super();
    69         }
    70 
    71         public Result(String msg) {
    72             super();
    73             this.msg = msg;
    74         }
    75 
    76         public String getMsg() {
    77             return msg;
    78         }
    79 
    80         public void setMsg(String msg) {
    81             this.msg = msg;
    82         }
    83     }
    84 
    85 }
    View Code
  • 相关阅读:
    Java实现Http请求的常用方式
    Java中Map和Object的互相转换方式
    java中过多if-else分支语句的优化方案
    将一个数组,以特定的字符拼接成字符串
    括号匹配算法
    面试题随笔1
    Docker run 的一些简单命令
    集群,负载均衡,分布式的区别
    Docker 容器的常用命令
    web应用常用的CURL基本命令
  • 原文地址:https://www.cnblogs.com/coldridgeValley/p/5273942.html
Copyright © 2020-2023  润新知