温故知新----线程之Runnable与Callable接口的本质区别
温故知新----线程之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个构造函数方法
1 public Thread()
2 public Thread(Runnable target)
3 Thread(Runnable target, AccessControlContext acc)
4 public Thread(ThreadGroup group, Runnable target)
5 public Thread(String name)
6 public Thread(ThreadGroup group, String name)
7 public Thread(Runnable target, String name)
8 public Thread(ThreadGroup group, Runnable target, String name)
9 public Thread(ThreadGroup group, Runnable target, String name,
long stackSize)
温故知新----线程之Runnable与Callable接口的本质区别的更多相关文章
- 使用Runnable和Callable接口实现多线程的区别
使用Runnable和Callable接口实现多线程的区别 先看两种实现方式的步骤: 1.实现Runnable接口 public class ThreadDemo{ public static voi ...
- Java多线程之Runnable与Thread
Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...
- Runnable和Callable接口辨析
突然发现和启动一个线程有关的有三函数,run(), call(), start(),有点小乱,所以特别梳理一下 首先说一下start(),这个是最好说的,感觉start()和run()这俩名字是真的有 ...
- 浅谈线程runnable和callable的使用及区别
线程使用比较广泛,但实际上一般项目很少用上线程,线程常用于优化复杂的程序执行流程,把一些与业务关系关系不大但是必须要执行的流程使用线程的方式让子线程去执行,主流程只返回跟业务有关的信息 runnabl ...
- 关于Thread的Runnable和Callable接口
其实非常简单:其实他们的区别就是Callable有返回值并且可以抛出异常. /** * Represents a command that can be executed. Often used to ...
- java--多线程之Runnable
引读: 上一篇博文中讲了Thread的继承,存在一个问题就是,如果类本身已经继承了某个父类,又要继承Thread,导致多重继承. [但是我们知道接口是实现多重继承的重要方式].java提供了Runna ...
- java基础---->多线程之Runnable(一)
java线程的创建有两种方式,这里我们通过简单的实例来学习一下.一切都明明白白,但我们仍匆匆错过,因为你相信命运,因为我怀疑生活. java中多线程的创建 一.通过继承Thread类来创建多线程 pu ...
- Java多线程之Thread、Runnable、Callable及线程池
一.多线程 线程是指进程中的一个执行流程,一个进程中可以有多个线程.如java.exe进程中可以运行很多线程.进程是运行中的程序,是内存等资源的集合,线程是属于某个进程的,进程中的多个线程共享进程中的 ...
- java 多线程:Callable接口;FutureTask类实现对象【Thread、Runnable、Callable三种方式实现多线程的区别】
Callable接口介绍: Java5开始,Java提供了Callable接口,像是Runnable接口的增强版,Callable接口提供了一个 call()方法可以作为线执行体. call()方法比 ...
- 通过Callable接口创建线程
通过Callable接口创建线程 一.前言 Java中创建线程的方式有四中,前两种在前面我已经详细介绍过了(Runnable和Thread),不清楚的朋友们可看这里: Java多线程之线程的启动以及J ...
随机推荐
- 1903021126 申文骏 Java 第六周作业 类与对象
项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 第六周作业 博客名称 1903021126 申文骏 Java 第六周作业 类与对象 要求 每道题要有题目,代码(使用插入代码,不会 ...
- SQL注入绕过某waf的详细过程。
0x00起因 看到大家都有绕waf的payload,想了想,这样下去不行啊.总不能找人家要吧,于是我开启了电脑,开始我的bypass之路. 0x01过程 准备完毕后,开始,首先判断注入and 1=1 ...
- windows jetbrains toolbox 无法修改应用安装目录(应用正在运行)的解决方案
打开 jetbrains toolbook安装目录/.settings.json 添加一行 "install_location": 指定的路径地址 解决方案来自 JetBrains ...
- 延期!欧盟新标EN IEC 62368-1:2020延至2024年7月6日生效
近日,TC108X成员投票同意将EN IEC 62368-1:2020(对应IEC 62368-1第三版)的DOW (Date Of Withdrawn)日期由原先的2023年1月6日延长至2024年 ...
- curl 查看响应时间
curl -o /dev/null -s -w "time_namelookup:%{time_namelookup}\ntime_connect: %{time_connect}\ntim ...
- Linux中/etc目录下passwd和shadow文件
/etc/passwd介绍 首先,通过cat /etc/passwd 来查看文件/etc/passwd中内容: root:x:0:0:root:/root:/bin/bash daemon:x:1:1 ...
- 2003031118-李伟-Python数据分析第三周作业-第一次作业
项目 NumPy数值计算基础 博客名称 2003031118-李伟-Python数据分析第三周作业-第一次作业 课程班级博客链接 https://edu.cnblogs.com/campus/pexy ...
- ES5及ES6的新增特性
介绍 es表示ECMASCript ,他是从es3,es5,es6,es5是2009.12月发布的,es6是2015.6月发布的.vue2完全支持es5的(vue3完全支持es6的),react完全支 ...
- Oracle游标或存储过程
/* 方式1:可执行选取代码块允许 */ declare cursor cur_tmp is ( select '' as tmp_status from dual ); begin for tmp_ ...
- 9.29 2020 实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
一.实验目的 Mininet 安装之后,会连带安装 Open vSwitch,可以直接通过 Python 脚本调用Open vSwitch 命令,从而直接控制 Open vSwitch,通过实验了解调 ...