Java中Runnable与Callable接口的区别详解

作者:爱我-中华 时间:2021-12-22 11:33:28 

预备知识

Java中的线程对象是Thread,新建线程也只有通过创建Thread对象的实例来创建。

先说结论

1 Runnable没有返回值的FunctionalInterface(jdk 1.8概念)接口,相反Callable是有返回值的FunctionalInterface接口

2 Runnable + Thread 创建一个无返回结果的任务线程

3 Runnable + Callable +Thread 创建一个有返回结果的任务线程

一:Runnable 示例

创建一个无返回结果的任务线程,so eazy !!!!

public static void main(String[] args) {
       new Thread(new Runnable() {
           @Override
           public void run() {
               System.out.println(Thread.currentThread().getName() + "我是一个无返回结果的任务线程");
           }
       },"线程一:").start(); //start()开启任务
   }

二:Callable示例

2.1 JAVA异步编程之Callbacks与Futures模型 

我是用Executors线程池的方式来创建的。

2.2 用最原始的方法

public class PrimitiveCallable implements Callable, Runnable {

public static void main(String[] args) {
       //实现
       new Thread(new PrimitiveCallable(), "线程二:").start();
   }
   @Override
   public void run() {//Runnable实现
       try {
           Object call = this.call();
           System.out.println(call);
       } catch (Exception exception) {
           exception.printStackTrace();
       }
   }
   @Override
   public Object call() throws Exception { //Callable 实现
       return "异步任务返回的结果!!!";
   }
}

2.3 FutureTask 一种jdk的实现方式

public class FutureTask<V> implements RunnableFuture<V> { //RunnableFuture 实现了以上2个接口
   ........省略.........
public void run() { //重写run实现
       if (state != NEW ||
           !UNSAFE.compareAndSwapObject(this, runnerOffset,
                                        null, Thread.currentThread()))
           return;
       try {
           Callable<V> c = callable; //构建对象是传入的参数
           if (c != null && state == NEW) {
               V result;
               boolean ran;
               try {
                   result = c.call(); //调用任务并返回结果
                   ran = true;
               } catch (Throwable ex) {
                   result = null;
                   ran = false;
                   setException(ex); //设置异常时的结果
               }
               if (ran)
                   set(result); //设置结果
           }
       } finally {
           runner = null;
           int s = state;
           if (s >= INTERRUPTING)
               handlePossibleCancellationInterrupt(s);
       }
   }
    ........省略.........
}

小结

1 不要纠结有几种创建线程的方法了,就一种即通过Thread,但Thread有9个构造函数方法

2 9个构造函数方法

public Thread()
public Thread(Runnable target)
Thread(Runnable target, AccessControlContext acc)
public Thread(ThreadGroup group, Runnable target)
public Thread(String name)
public Thread(ThreadGroup group, String name)
public Thread(Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name,
                 long stackSize)

来源:https://www.cnblogs.com/jinliang374003909/p/17261669.html

标签:Java,Runnable,Callable
0
投稿

猜你喜欢

  • MAC算法之消息摘要算法HmacMD5的实现

    2023-02-13 08:03:28
  • springboot如何读取自定义properties并注入到bean中

    2022-12-16 22:22:09
  • Java深入探究Object类的方法

    2022-11-24 06:48:53
  • Springboot-Starter造轮子之自动锁组件lock-starter实现

    2022-01-21 03:53:59
  • 接口签名怎么用Java实现

    2023-02-18 03:22:10
  • Spring Cloud Ribbon客户端详细介绍

    2023-11-27 21:36:22
  • Android中Snackbar的使用方法及小技巧

    2023-10-30 03:13:31
  • java 如何读取远程主机文件

    2022-03-23 05:18:19
  • Java对zip,rar,7z文件带密码解压实例详解

    2023-11-29 05:08:32
  • 提高C# StringBuilder操作性能优化的方法

    2023-04-26 01:16:13
  • C# 绘制统计图大全(柱状图, 折线图, 扇形图)

    2023-03-12 09:16:26
  • Android 在 res/layout 文件夹 下创建一个 子文件夹实例

    2021-07-31 22:50:21
  • C#对Json进行序列化和反序列化

    2023-04-16 09:06:15
  • feign 如何获取请求真实目的ip地址

    2021-08-13 15:47:49
  • c#滚动字幕动画窗体制作步骤

    2023-12-06 20:12:58
  • C#利用VS中插件打包并发布winfrom程序

    2022-01-01 21:18:22
  • SpringBoot中使用Session共享实现分布式部署的示例代码

    2022-10-17 04:27:54
  • 详解springboot项目带Tomcat和不带Tomcat的两种打包方式

    2023-11-28 08:23:41
  • 详解Java中的Vector

    2023-06-05 01:40:49
  • Java同步锁Synchronized底层源码和原理剖析(推荐)

    2023-09-25 08:36:22
  • asp之家 软件编程 m.aspxhome.com