这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析。

通过三种方法可以创建java线程:

1、继承Thread类。

2、实现Runnable接口。

3、实现Callable接口,并通过FutureTask的实例注入到Thread的target中。

创建java线程首要的目的是通过新创建的线程执行自己的代码逻辑,就是实现重载run方法。

所以我们无论是继承Thread类还是实现Runnable接口,要做的就是重载run方法,实现自己的代码逻辑。

接下来是运行:无论使用哪种方法实现自定义线程,我们都要创建线程实例(继承Thread类的方式是通过派生类对象的创建,从而创建父类对象)。然后通过执行Thread实例的Start方法,将该实例加入到ThreadGroup中,然后通过native方法start0运行该Thread实例。

经过一系列运行状态的检测(具体干了啥,都在native方法中),最终调用Thread实例的run方法(实现Runnable接口)或者调用Thread派生类实例的run方法(继承Thread类)。

实现Runnable和继承Thread的区别在于继承Thread类的线程类不能再继承其他父类(Java单继承决定)。当然有的博文表示实现Runnable接口的方式可以使Runnable实现类的代码被多个Thread共享,其实只是将Runnale的实现类的实例注入到了多个Thread的target字段中,这些Thread实例操作的是同一个Runnable接口的实现类实例。这当然可以实现共享,但Runnable的子类如Thread都可以被注入到Thread类的target中。

使用Runnable实现run方法在设计模式上更加符合面向对象组合的要求。

还有一种方式是使用Callable<T>接口,这种方式实质上和Runnable是一致的。使用Callable<T>能够使线程返回类型为T的值。

主要方法是:

  FutureTask<Integer> futureTask = new FutureTask<Integer>((Callable<Integer>)()->{ System.out.println("callable create thread"); return 5; } )

  new Thread().start();

然后通过使用FutureTask类的get方法获取返回值,该方法会阻塞直到线程退出。FutureTask继承了Future<T>和Runnable接口,所以能够被注入到target中。

线程执行后,调用FutureTask实例的run方法,该方法中调用callable的call方法,因此,Callable中的call方法可以存放自定义线程代码逻辑的实现。

call方法的返回值被存放在outcome属性中。然后通过FutureTask的get方法获取。

java创建线程的三种方法的更多相关文章

  1. java 创建线程的三种方法Callable,Runnable,Thread比较及用法

    转自:http://www.chinaitlab.com/Java/line/942440.html 编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互.一般有三种方法,Thread, ...

  2. Java创建线程的三种方法比较

    一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别 (1)Callable规定的方法是call(),Runnable规定的方法是run(). ...

  3. 《Java多线程面试题》系列-创建线程的三种方法及其区别

    1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javab ...

  4. (转)Java结束线程的三种方法

    背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...

  5. Java结束线程的三种方法(爱奇艺面试)

    线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...

  6. Java并发编程(二)创建线程的三种方法

    进程与线程 1.  进程 进程和代码之间的关系就像音乐和乐谱之间的关系一样,演奏结束的时候音乐就不存在了但乐谱还在:程序执行结束的时候进程就消失了但代码还在,而计算机就是代码的演奏家. 2. 线程 线 ...

  7. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

  8. java创建线程的三种方式及其对比

    第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务.第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务.第三种方法:实现c ...

  9. AJPFX总结java创建线程的三种方式及其对比

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行 ...

随机推荐

  1. redis的主从复制(读写分离)/哨兵(主从切换)配置

    准备两个redis服务,两台机器,依次命名文件夹子master,slave1 10.10.10.7 10.10.10.8 1.master修改配置文件 [root@db2 conf]# cat 637 ...

  2. 数据库 --> sqlite3总结

    Sqlite3总结 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中. sqlite语句 #sqlite3 test.db //设置宽度为2sqlit ...

  3. c++ --> 返回值分析

    返回值分析 函数不能通过返回指向栈内存的指针,返回指向堆内存的指针是可以的. 一.返回局部变量的值 可以有两种情况:返回局部自动变量和局部静态变量,比如: int func() { ; // 返回局部 ...

  4. 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。

    #include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]) { int a,b,i,j=0,t; ...

  5. poj2991 Crane(线段树+集合)白书例题

    题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...

  6. 20155214&20155216 实验一 开发化境的熟悉

    20155214&20155216 实验一 开发化境的熟悉 实验内容: 实验一 开发化境的熟悉-1-交叉编译环境-(使用实验室台式机) 1.建立实验目录"mkdir linux_组员 ...

  7. 个人技术博客(alpha)

    APP的权限校验不同于web网页端,web一般使用session记录用户的状态信息,而app则使用token令牌来记录用户信息.有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在 ...

  8. bzoj千题计划251:bzoj3672: [Noi2014]购票

    http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...

  9. BAT齐聚阿里安全-ASRC生态大会:呼吁联合共建网络安全白色产业链

    图说:近日,阿里安全-ASRC生态大会在杭州举行,包括BAT在内的20余家国内知名互联网企业代表,回顾过去一年网络安全面临的问题与挑战,共谋生态安全治理思路. "123456.111111. ...

  10. windows系统下安装 node.js (node.js安装及环境配置)

    node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node. ...