创建线程的三种方法_如何理解三种创建线程方式的优缺点-秃头伤不起

news/2024/7/9 16:33:11

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。

一、继承Thread类创建线程类

  1. 重写run方法。该run()方法的方法体就代表了线程需要完成的任务。
  2. 创建Thread子类的实例。
  3. 调用线程对象的start()方法来启动该线程。

d08813406b60b728848984785846ed77.png

二、实现Runnable接口创建线程类

  1. 定义Runnable的实现类,重写run()方法。
  2. 创建Runnable实现类的实例,并以此作为Thread的target来创建对象,该对象才是真正的线程对象。

edc4172bc3b42c276837acb9a77c799e.png

三、使用Callable和Future创建线程

  1. 创建Callable接口的实现类,并实现Call()方法,该方法将作为线程执行体,且该方法有返回值,再创建Callable实现类的实例。从Java8开始,可以直接使用Lambda表达式创建Callable对象。
  2. 使用FutureTask来包装Callable对象,该FutureTask对象封装了该Callable对象的call方法的返回值。
  3. 使用FutureTask对象作为Thread对象的target创建并启动新线程。
  4. 调用FutureTask对象的get()方法来获取子线程执行结束后的返回值。

4b9275fad3b003a744a8bff528c4c56b.png

四、浅谈三种方式优劣势

通过继承Thread类或实现Runnable、Callable接口都可以实现多线程,不过实现Runnable接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法有返回值,可以声明抛出异常而已。因此可以将实现Runnable接口和实现Callable接口归为一种方式。这种方式与继承Thread方式之间的主要差别如下。

1.采用实现Runnable、Callable接口的方式创建多线程的优缺点。

优势

  • 线程类只是实现了Runnable接口与Callable接口,还可以继承其他类。
  • 在这种方式下,多个线程可以共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

劣势

  • 编程稍稍复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法。

2.采用继承Thread类的方法创建多线程的优缺点。

优势

  • 编写简单,如果需要访问当前线程,则无须使用Thread.currentThread()方法,直接使用this即可获得当前线程。

劣势

  • 因为线程类已经继承了Thread类,所以不能再继承其他父类。

五、总结

鉴于上面分析,因此一般推荐采用实现Runnable接口、Callable接口的方式来创建多线程。

掌声呐????


http://www.niftyadmin.cn/n/2419664.html

相关文章

【项目管理】低成本提高关键路径成功率

编者按:本文起因于一次与同事讨论日常工作的管理,思考如何轻量级运用项目管理知识提高任务成功率。 关键路径法(Critical Path Method,CPM),又称为要径法,是计划项目活动中用到的一种算术方法。…

/lib64/libc.so.6: version `GLIBC_2.16‘ not found (required by node)

在linux上安装node环境好了后,想运行node试一下,报错/lib64/libc.so.6: version GLIBC_2.16’ not found (required by node) 这个错误的原因是未安装2.17版本的glibc库。 一、查看系统中可使用的glibc版本 //使用strings命令查看 strings /lib64/libc…

python用for和if结合判断_python基础之流程控制(if判断和while、for循环)

程序执行有三种方式:顺序执行、选择执行、循环执行一、if条件判断1、语句(1)简单的 if 语句(2)if-else 语句(3)if-elif-else 结构(4)使用多个 elif 代码块if-elif-elif-...-else(elif可以使用多个)(5)省略 else 代码块if-elif-elif(else可以省去)(6)测试多个条件(简…

/usr/lib64/libstdc .so.6: version `GLIBCXX_3.4.14‘ not found (required by node)

在linux上安装node环境好了后,想运行node试一下,报错 /usr/lib64/libstdc .so.6: version GLIBCXX_3.4.14’ not found (required by node) 在安装node的时候出现报错,提示/usr/lib64/libstdc.so.6: version GLIBCXX_3.4.14’ not found &am…

散列表查找失败平均查找长度_《算法图解》学习记录5--散列表

散列表( hash table)  学习散列表——最有用的基本数据结构之一。散列表用途广泛,本章将介绍其常见的用途。 学习散列表的内部机制:实现、冲突和散列函数。这将帮助你理解如何分析散列表的性能。散列表是一种包含额外逻辑的数…

Cannot read properties of undefined (reading ‘extraneous‘) npm install时

项目为了上基线,把本地项目编译之后的node_modules文件和dist文件都删掉了,然后上完基线之后,重新编译本地项目代码,结果初始化项目失败,提示无法读取未定义的“外部”属性,原因就是上一次编译的项目包没有…

新闻管理系统_东莞应急管理代表队在全省应急管理系统篮球友谊赛中勇夺冠军...

11月29日由广东省应急管理厅主办的全省应急管理系统篮球友谊赛决赛在广州越秀区顺利开赛。经过激烈角逐,最终,东莞应急管理代表队以77分获得本次比赛的第一名。省应急管理厅党组书记、厅长王中丙,党组成员、副厅长高涌涛观摩了此次比赛并分别…

linux上安装mongodb(详解)

1.cd …/ cd usr/ 从网页上直接下载mongodb压缩包 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.1.tgz如果下载以后是这样的,把?后面的删掉就可以了 2.解压压缩包 tar zxvf mongodb-linux-i686-1.8.1.tgz3.创建mongod文件夹及其子文…