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

通过三种方法可以创建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. java中的并发工具类

    在jdk的并发包里提供了几个非常有用的并发工具类.CountDownLatdch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线 ...

  2. mysql的备份脚本

    mysql的备份脚本 脚本如下 #!/bin/sh # mysql_backup.sh: backup mysql databases and keep newest 5 days backup. # ...

  3. 云服务器Windows Server2012 配置http服务器(又称Web服务器,IIS)

    出错:无法打开运行空间池.服务器管理器WinRM插件可能已损坏或丢失. 解决方法: http://shiyousan.com/post/636308065767125916 第一步是开启WinRM服务 ...

  4. (译文)开始学习Vue——构建你的第一个Vue应用

    我们要构建如下组件:(最终代码在这里:https://codesandbox.io/s/38k1y8x375) 开始 Vue是支持单文件组件的,但是我们不准备这么做.你也可以构建一个全局的组件,通过V ...

  5. 记录python接口自动化测试--requests使用和基本方法封装(第一目)

    之前学习了使用jmeter+ant做接口测试,并实现了接口的批量维护管理(大概500多条用例),对"接口"以及"接口测试"有了一个基础了解,最近找了一些用pyt ...

  6. 网络1712--c语言第二次作业总结

    1.作业亮点 1.1在调试问题方面有明显进步,变量声明方面有所改变,没有发现大面积抄袭现象. 1.2 以下几位同学博文写的较为优秀,可作为范例供大家参考 田亚琴--代码格式良好,思路清晰,调试部分图文 ...

  7. 基于Python的Web应用开发实践总结

    基于Python的Web应用开发学习总结 项目地址   本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...

  8. 20162323周楠《Java程序设计与数据结构》第五周总结

    20162323周楠 2016-2017-2 <程序设计与数据结构>第五周学习总结 教材学习内容总结 1.面向对象软件设计的基本部分是确定程序中应该创建哪些类: 2.面向对象程序设计的核心 ...

  9. POST请求的提交

    var http = require("http"); var querystring = require("querystring"); //创建服务器 va ...

  10. Storm概念讲解和工作原理介绍

    Strom的结构 Storm与传统关系型数据库     传统关系型数据库是先存后计算,而storm则是先算后存,甚至不存     传统关系型数据库很难部署实时计算,只能部署定时任务统计分析窗口数据   ...