Java中Runnable与Callable接口的区别详解
作者:爱我-中华 发布时间:2021-12-22 11:33:28
标签:Java,Runnable,Callable
预备知识
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


猜你喜欢
- 1. 前言在Java开发中接触的开发者大多数不太注重对接口的测试,结果在联调对接中出现各种问题。也有的使用Postman等工具进行测试,虽然
- 本文讲述绘制Android自定义各种图形效果,为自定义控件的入门篇 相关视频链接: Android自定义控件系列 http://edu.cs
- annotation就是注解的意思,在我们使用的 * 时,可以通过业务层添加的某个注解,对业务方法进行拦截,之前我们在进行统一方法拦截时使用
- 1.可变参数模板C++11的新特性可变参数模板能够让我们创建可以接受可变参数的函数模板和类模板,相比C++98和C++03,类模板和函数模板
- 一般在使用RecyclerView的时候不免要修改RecyclerView的数据,使用notifyDataSetChanged()来刷新界面
- 刚刚接触Java不久,写法上和一些术语还不是很熟悉,如有不对的地方,希望指正。本次学生成绩系统要求能实现成绩录入, * ,绩点计算,退出系
- 具体不做详细介绍了,直接上代码/// <summary> /// 功能:FileStream文件流读取文件 &nbs
- Vector的基本介绍1.:Vector类的定义:public class Vector<E> ext
- JAVA的 * 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤
- private void button1_Click(object sender, EventArgs e) &nbs
- 1.背景Java语言相比于C和C++,一个最大的特点就是不需要程序员自己手动去申请和释放内存,这一切交由JVM来完成。在Java中,运行时的
- code #1private void Form1_SizeChanged(object sender, EventArgs e) //最小
- 本文通过是 * 实现的AOP功能的封装与配置的小框架.加深对 * 和AOP编程的理解设计根据配置文件的键xxx对应的值(类全名)创建相应
- 最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库。因此为了更好的理解公司框架,我就自己先用spring mvc实现了
- 一、题目描述题目:同步锁出现的目的就是为了解决多线程安全问题。同步锁的几种方式synchronized1、同步代码块2、同步方法jdk1.5
- 1.多数元素题目描述思路详解这个思路比较简单,先排序,排序过后遍历如果后一个等于前一个输出就好代码与结果class Solution { &
- 一,为什么说是真正的 * ?阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下 "仿微信打开网页的进度条效
- 谷歌的AI击败了一位围棋大师,是一种衡量人工智能突然的快速发展的方式,也揭示了这些技术如何发展而来和将来可以如何发展。人工智能是一种未来性的
- java接口返回参数按照请求参数进行排序在项目实际开发中可能遇到过这种问题,接口请求参数顺序是[a,b,c],结果返回的数据是[bObjec
- IDEA设置文档注释模板创建Class文件时自动生成的头部注释如图如何配置idea的头部注释格式,可以生成像之前的注释格式一样的文档注释?F