Java创建多线程的五种方法_java 创建多线程任务-程序员宅基地

技术标签: Java  java  多线程  后端  开发语言  

Java创建多线程的五种方法

  • 仅作为Java编程的交流和学习,如有问题还望不吝赐教。欢迎补充和交流,转载请注明!

(一)继承Thread类

1.实现描述

  • 通过继承Thread并且重写其run( ),run方法中定义需要执行的任务。创建后的子类通过调用start( )方法即可执行线程方法。
  • 通过继承Thread实现的线程类,多个线程间无法共享线程类的实例变量。需要创建不同Thread对象,自然不共享资源。

2.具体步骤

1)定义UserThread类,继承Thread类
2)重写run( )方法
3)创建UserThread对象
4)调用start( )方法

3.代码实现

在这里插入图片描述
在这里插入图片描述
执行结果

4.注意事项

  • 数据资源不共享,多个线程分别完成自己的任务。比如三个售票窗口同时售票,各自卖各自的票,会出现三个售票窗口出售同一张票的问题。

(二)实现Runnable接口

1.实现描述

  • 需要先定义一个类实现Runnable接口并重写该接口的run( )方法,此run方法是线程执行体。接着创建 Runnable实现类的对象,作为创建Thread对象的参数target,此Thread对象才是真正的线程对象。
  • 利用实现Runnable接口的线程类创建对象,可以实现线程之间的资源共享。

2.具体步骤

1)定义一个UserRun类,实现Runnble接口
2)重写run( )方法
3)创建UserRun类的对象
4)创建Thread类的对象,UserRun类的对象作为Thread类构造方法的参数
5)启动线程

3.代码实现

在这里插入图片描述
在这里插入图片描述
输出结果

4.注意事项

  • 数据资源共享,多个线程共同完成一个任务(多个线程共享了创建线程对象的资源)。比如三个售票窗口(三个线程)同时售票(MyThread类中的ticket),三个线程共同使用资源。

(三)实现Callable接口

1.实现描述

  • Callable接口如同Runable接口的升级版,其提供的call( )方法将作为线程的执行体,同时允许有返回值。
  • Callable对象不能直接作为Thread对象的target,因为Callable接口是 Java5 新增的接口,不是Runnable接口的子接口。
  • 对于这个问题的解决方案,就引入 Future接口,此接口可以接受call( )的返回值,RunnableFuture接口是Future接口和Runnable接口的子接口,可以作为Thread对象的target。

2.具体步骤

1)定义类UserCallable,实现Callable接口
2)重写call( )方法
3)创建UserCallable的对象
4)创建RunnableFuture接口的子类FutureTask的对象,构造函数的参数是UserCallable的对象
5)创建Thread类的对象,构造函数的参数是FutureTask的对象
6)启动线程

3.代码实现

在这里插入图片描述
在这里插入图片描述
输出和结果

4.注意事项

  • 数据资源共享,多个线程共同完成一个任务(多个线程共享了创建线程对象的资源)。比如三个售票窗口(三个线程)同时售票(MyThread类中的ticket),三个线程共同使用资源。同时,线程调用完毕后还会带有返回值

(四)继承TimerTask类

1.实现描述

  • 定时器类Timer和TimerTask可以做为实现线程的另一种方式。
  • Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。
  • TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。

2.具体步骤

1)定义类UserTimerTask,继承抽象类TimerTask
2)创建UserTask类的对象
3)创建Timer类的对象,设置任务的执行策略

3.代码实现

在这里插入图片描述
在这里插入图片描述

输出结果

4.注意事项

  • 定时器类创建线程更多的是用于定时任务的处理,并且各线程间数据资源不共享,多个线程分别完成自己的任务。

(五)通过线程池启动多线程

1.实现描述

  • 通过Executors 的工具类可以创建线程池。
  • 提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行。
  • 降低系统资源消耗,通过重用已存在的线程降低线程创建和销毁造成消耗。
  • 方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并目会造成CPU过度切换。

2.实现方法

1) FixThreadPool(int n)固定大小的线程池
(1)具体步骤

① 通过Executors.newFixedThreadPool(5)创建固定大小的线程池
② 重写Runnable类的run( )方法,并使用线程池执行任务
③ Shutdown( )关闭线程池

(2)代码实现

在这里插入图片描述
执行结果

(3)注意事项
  • 创建固定大小的线程池,可实现数据资源共享,多个线程共同完成一个任务。
2)SingleThreadExecutor( )单线程池
(1)具体步骤

① 通过Executors.newSingleThreadExecutor( )创建单线程池
② 重写Runnable类的run( )方法,并使用线程池执行任务
③ Shutdown( )关闭线程池

(2)代码实现

在这里插入图片描述
执行结果

(3)注意事项
  • 线程池仅创建一个线程执行任务。
3)CachedThreadPool( )缓存线程池
(1)具体步骤

① 通过Executors.newCachedThreadPool( )创建尽可能多的线程池
② 重写Runnable类的run( )方法,并使用线程池执行任务
③ Shutdown( )关闭线程池

(2)代码实现

在这里插入图片描述
执行结果

(3)注意事项
  • 该方法会创建尽可能多的线程来完成任务,如案例中虽然只有10张票,但线程池却生成了至少12个线程。
4)ScheduledThreadPool(int n)定时周期性线程池
(1)具体步骤

① 通过Executors.newScheduledThreadPool(5)创建固定核心线程数(最小维护的线程数,线程创建后不会被回收)的线程池,线程按计划定期执行。
② 重写Runnable类的run( )方法,并使用线程池执行任务
③ Shutdown( )关闭线程池

(2)代码实现

在这里插入图片描述
执行结果

(3)注意事项
  • 创建一个周期性的线程池,支持定时及周期性执行任务(第一个时间参数是执行延迟时间,第二个参数是执行间隔时间)。
5)WorkStealingPool( )新线程池类ForkJoinPool的扩展
(1)具体步骤

① 通过Executors.newWorkStealingPool( )创建线程池
② 重写Runnable类的run( )方法,通过Thread类的对象调用Runnable类的对象,使用线程池执行任务
③ Sleep( )让主线程等待子线程执行完毕,也可以使用计数器的方式
④ Shutdown( )关闭线程池

(2)代码实现

在这里插入图片描述
执行结果

(3)注意事项
  • 因为每一个线程都有一个自己的任务队列,因为任务有多有少,可能造成CPU负载不均衡。通过本方法可以有效利用多核CPU优势,少任务的线程可以通过“窃取”任务较多的线程的任务,从而均衡各CPU任务的执行情况。

欢迎补充和交流,转载请注明!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013550998/article/details/122256484

智能推荐

.NET:System.Security.Cryptography.CryptographicException 的解决办法-程序员宅基地

文章浏览阅读6.4k次。详细内容参考此网址:http://social.msdn.microsoft.com/Forums/en-US/ec93922a-fd1e-4225-b5cf-1472ebb3acd1/systemsecuritycryptographycryptographicexception-the-system-cannot-find-the-file-specified?forum=netfxbcl。_system.security.cryptography.cryptographicexception: 不正确的数据。

动态版通讯录_动态通讯录-程序员宅基地

文章浏览阅读278次,点赞15次,收藏7次。目录一.通讯录的准备工作二.通讯录的实现步骤创建主菜单存放个人信息(静态)存放个人信息(动态)增加联系人(静态)增加联系人(动态)显示联系人删除指定的联系人查找指定联系人修改指定的联系人销毁通讯录(动态)三.源代码(动态)一.通讯录的准备工作首先我们要想一想开辟一个通讯录我们需要做哪些工作。要存放一些人的基本信息(名字+性别+年龄+电话+住址),增加联系人,删除联系人,修改联系人,查找联系人,最后要存入文档以便找不到。这里我们..._动态通讯录

win10和ubuntu的pyCharm配置python解释器_ubuntu conda环境文件夹中没有python.exe-程序员宅基地

文章浏览阅读2.5k次。ubuntu配置python3.6文件---新建项目---选择需要的python版本(基本解释器python3.6)创建---新建Python文件test01.py打开设置添加系统Python解释器,点齿轮--添加--系统解释器 选择python3 点击确定点击添加配置点击 “+” -> Python选定脚本路径点击确定,配置完成..._ubuntu conda环境文件夹中没有python.exe

StringUtils工具类常用方法汇总(判空、转换、移除、替换、反转)_stringutils.remove-程序员宅基地

文章浏览阅读4.9k次,点赞8次,收藏26次。Apache commons lang3包下的StringUtils工具类中封装了一些字符串操作的方法,非常实用,使用起来也非常方便。最近自己也经常在项目中使用到了里面的一些方法,在这里将常用的方法总结了一下,方便以后查阅,大家有兴趣也可以看一下。  首先需要说明的一点是,StringUtils类在操作字符串时,即使操作的为null值也是安全的,不会报NullPointerException,这一..._stringutils.remove

html如何做点击按钮左侧展开收起,如何使用CSS3 实现侧边栏展开收起动画-程序员宅基地

文章浏览阅读1.2k次。@keyframes规则用于创建动画。@keyframes 中规定某项 CSS 样式,就能创建由当前样式逐渐改为新样式的动画效果@keyframes 中创建动画时,请把它捆绑到某个选择器,否则不会产生动画效果。通过规定至少以下两项 CSS3 动画属性,即可将动画绑定到选择器:规定动画的名称规定动画的时长animationanimation 属性是一个简写属性,用于设置动画属性:animation-..._keyframes向左展开动画

python游戏程序代码大全_童年游戏,Python一行代码就能实现!-程序员宅基地

文章浏览阅读2.5k次。大家好,儿童节到了,虽然秃头程序员没有头发,但是童心还是一直都在的,今天就分享一个私藏的GitHub项目——free-python-games,一行代码就能进入使用Python开发的小游戏快乐玩耍!安装与使用安装当然也很简单一行代码就可以pip install freegames由于该项目中的所有游戏均是基于Python内置模块Turtle制作,所以没有太多依赖,安装不会有困难。安装完之后我们可以..._童年游戏代码大全

随便推点

PMP证书有效期是多久?这里告诉你答案_pmp考过之后使用年限-程序员宅基地

文章浏览阅读1.4k次。PMP指项目管理专业人士资格认证。它是由美国项目管理协会PMI举办的项目管理专业人员PMP认证考试,是目前含金量最高的证书,具有很高的权威性。截止到根据PMI认证人数统计,2020年3月,PMP全球有效认证人士为1034640人。粗略计算,PMP认证在PMI的各个认证的人数总和中占比达到92%。PMP人才活跃在中国重大项目的关键岗位,而且,PMP证书不受行业限制,不管是IT、建筑、制药、制造业还是电信、金融、通信领域,PMP证书都受到企业广泛的高度认可。适用于大部分的项目型企业或企业中的项目_pmp考过之后使用年限

YOLOV3实战4:Darknet中cfg文件说明和理解_yolo cfg-程序员宅基地

文章浏览阅读4.7w次,点赞89次,收藏435次。大家好,我是小p,从今天起,将逐渐从源码角度解析Darknet,欢迎加入对象检测群813221712讨论和交流,进群请看群公告!今天将要说明的是Darknet中的cfg文件,废话少说,直接干!(以cfg/yolov3.cfg为例,其它类似)[net] ★ [xxx]开始的行表示网络的一层,其后的内容为该层的参数配置,[net]为特殊的层,配置整个网..._yolo cfg

python生成唯一Id的几种方法_python并发生成唯一数据-程序员宅基地

文章浏览阅读2w次,点赞2次,收藏4次。# coding:utf-8import randomdef createRandomString(len): print ('wet'.center(10,'*')) raw = "" range1 = range(58, 65) # between 0~9 and A~Z range2 = range(91, 97) # between A~Z and a~..._python并发生成唯一数据

Maven1-配置及创建JavaSE项目_maven 创建javase工程-程序员宅基地

文章浏览阅读431次。一、Maven简介项目构建工具(不只是管理jar包),项目设计和编码由程序员来做,它做不了;而编译,运行,测试,打包,部署,jar管理它都能做Apache提供,Java开发的,运行Maven要有基本的java开发工具包Maven仓库:存储jar包本地仓库:当前本地电脑远程仓库:局域网中的服务器中央仓库:远程服务器有远程仓库:本地连接远程,远程仓库中有就下载到本地,没有就去连中央仓库,中央仓库下载到远程,远程再下载到本地,适合团队开发,远程仓库可以连接多个本地仓库,所以很多公_maven 创建javase工程

【转载】FPGA配置方式_quartus烧录-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏31次。【概要】FPGA配置方式首先介绍下AS、PS、JTAG三种模式的区别。AS模式: 主动串行配置模式。将.pof文件烧写到flash(掉电不丢失)芯片,FPGA器件每次上电时,作为主控制器从配置器件flash(EPCS)主动读取程序文件并存放至FPGA内部的配置存储器(configure RAM),实现逻辑运作,该方法适用于不需要经常升级的场合,一次性读取程序文件;PS..._quartus烧录

GitHub集成Circle CI(附 Circle CI 配置示例文件)_circleci building status github-程序员宅基地

文章浏览阅读1.6k次。文章目录GitHub 集成Circle CICI(持续集成) 简单解释CI 工具Circle的使用将GitHub项目授权给 Circle CI书写 config.yml文件测试 Circle CI 配置文件是否生效备注写在最后GitHub 集成Circle CICI(持续集成) 简单解释CI 即 Continuous Integration. 当代码提交上来有变动的时候,在merge之前自动进行一些流程,如:代码风格检查、单元测试是否通过等。当被merge之后,又会自动进行一些流程,如:自动打包、_circleci building status github