突然发现和启动一个线程有关的有三函数,run(), call(), start(),有点小乱,所以特别梳理一下

首先说一下start(),这个是最好说的,感觉start()run()这俩名字是真的有点容易混

其实,start()是我们用extends Thread方式写一个线程才会遇到的问题,其中的逻辑就是,start()会调用run()方法,就run()方法自己而言,其实就是一个同步的方法,所以如果在main中直接调用一个线程的run方法,会看到多个线程会顺序执行。

只有用start方法开始线程,才能真正异步执行

上面只是简单提一下,下面说这篇文章的重点内容

Runnable 和 Callable 有什么区别呢

其实看一下run()call()的接口就知道了

public void run();
public Object call() throws Exception;

一个有返回值,一个没有。然而没这么简单,当我们要用他的返回值的时候,问题就出现了。

在说返回值之前,先简单说一下Callable实现的线程怎么启动

Callable tt2 = new t2();
FutureTask task = new FutureTask<Integer>(tt2);
new Thread(task).start();

其中FutureTask就是返回值的类型,这里是如何启动Callable线程,还有其他的线程池方法,会在今后介绍线程池的时候讲解

下面就要说会发生什么问题了,其实就是我们可以通过get方法来获得线程的返回值,但是,在我们调用get的时候,如果线程尚未返回,那么调用者线程将会被阻塞,直到获取返回值

Callable tt2 = new t2();
FutureTask task = new FutureTask<Integer>(tt2);
task.get()
new Thread(task).start();

上面就是一个简单的死锁的例子,相信聪明的你一定理解我的意思了


个人的理解是Callable线程更多地被应用在并行结算等场合上,而不是处理业务逻辑上,所以Callable线程往往应该更短一些,同时可以一次启动多个,以便快速地获得相应的返回值

Runnable和Callable接口辨析的更多相关文章

  1. 使用Runnable和Callable接口实现多线程的区别

    使用Runnable和Callable接口实现多线程的区别 先看两种实现方式的步骤: 1.实现Runnable接口 public class ThreadDemo{ public static voi ...

  2. 关于Thread的Runnable和Callable接口

    其实非常简单:其实他们的区别就是Callable有返回值并且可以抛出异常. /** * Represents a command that can be executed. Often used to ...

  3. java 多线程:Callable接口;FutureTask类实现对象【Thread、Runnable、Callable三种方式实现多线程的区别】

    Callable接口介绍: Java5开始,Java提供了Callable接口,像是Runnable接口的增强版,Callable接口提供了一个 call()方法可以作为线执行体. call()方法比 ...

  4. 使用Callable接口创建线程和使用线程池的方式创建线程

    1.使用Callable接口的方式实现多线程,这是JDK5.0新增的一种创建多线程的方法 package com.baozi.java2; import java.util.concurrent.Ca ...

  5. Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)

    这一系列的文章暂不涉及Java多线程开发中的底层原理以及JMM.JVM部分的解析(将另文总结),主要关注实际编码中Java并发编程的核心知识点和应知应会部分. 说在前面,Java并发编程的实质,是线程 ...

  6. Java:多线程,分别用Thread、Runnable、Callable实现线程

    并发性(concurrency)和并行性(parallel)是两个概念,并行是指在同一时刻,有多条指令在多个处理器上同时执行:并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得宏观 ...

  7. Java多线程之Thread、Runnable、Callable及线程池

    一.多线程 线程是指进程中的一个执行流程,一个进程中可以有多个线程.如java.exe进程中可以运行很多线程.进程是运行中的程序,是内存等资源的集合,线程是属于某个进程的,进程中的多个线程共享进程中的 ...

  8. JDK 5.0 新增解决线程安全 Callable接口和线程池

    在jdk5.0后又新增了两种解决线程安全的问题 一: 实现Callable接口, 实现接口步骤: 1: 创建一个实现Callable接口的实现类 2: 实现Callable接口中的call()方法, ...

  9. JUC之Callable接口回顾和JUC辅助类

    Callable接口和JUC辅助类 Callable接口: 回顾: 创建线程的四种方式: 继承Thread 实现runnable接口 实现callable接口 使用线程池 之前的文章:多线程编程1-定 ...

随机推荐

  1. 全栈开发工程师微信小程序-上(中)

    全栈开发工程师微信小程序-上(中) width: 750rpx; 750rpx代表与屏幕等宽,rpx的缩写responsive pixel,这个单位是可以根据屏幕大小进行自适应调整的像素单位. 小程序 ...

  2. 《http权威指南》读书笔记14

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

  3. apollo入门demo实战(二)

    1. apollo入门demo实战(二) 1.1. 下载demo 从下列地址下载官方脚本和官方代码 https://github.com/nobodyiam/apollo-build-scripts ...

  4. OAuth2.0深入理解

    1. OAuth2.0深入理解 1.1. 概念 OAuth(Open Authorization)开放授权,表示将系统功能部分授权给第三方系统调用,实现更细颗粒度的权限控制 OAuth是一种在线授权或 ...

  5. Spring Cloud Config采坑记

    1. Spring Cloud Config采坑记 1.1. 问题 在本地运行没问题,本地客户端服务能连上本地服务端服务,可一旦上线,发现本地连不上线上的服务 服务端添加security登录加密,客户 ...

  6. 使用Json封装scroll,已处理其兼容性问题

    scroll.js /* 使用Json封装scroll */ function scroll(){ //标准模式(遵循W3C标准) if(pageYOffset!==null){ return { t ...

  7. 微信小程序内嵌网页的一些(最佳)实践

    前言 3 个月前,微信小程序推出了 web-view 组件引发了一波小高潮,笔者所在的大前端团队写过一篇浅析,详情可见:浅谈微信小程序前端生态. 我们曾大胆猜想,这一功能,可能直接导致小程序数量增长迎 ...

  8. document.getElementsByClassName返回的是一个数组

    转载自:https://www.cnblogs.com/shark1100913/p/6713327.html   document.getElementsByClassName("a&qu ...

  9. mac Navicat 破解+汉化(亲测可用)

    Navicat Premium 12 的版本 破解太麻烦,最后选择 Navicat Premium 11.0.16 下载:地址 提取码:h3rq ps:用的是功能,不是版本 为了一次就成功,请先执行下 ...

  10. 分享一个基于web的满意度调查问卷源码系统

    问卷调查系统应用于各行各业,对于企业的数据回收统计分析战略决策起到至关作用.而现有的问卷调查系统大都是在线使用并将数据保存在第三方服务器上.这种模式每年都要缴纳费用并且数据安全性得不到保证.所以说每个 ...