java多线程及

多线程使用

在java中,多线程得主要实现方式有四种:继承Thread类,实现Runnable接口、实现callable接口通过FutureTask包装器来创建Thread线程,使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,而后两种是带返回值的。除此之外,通过Timer启动定时任务,或者通过像Spring Task和quartz这样的第三方任务调度框架也可以开启多线程任务

继承Thread类创建线程

Thread类本质上也是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程比较简单,通过继承Thread类并复写run()方法,就可以启动新线程并执行自己定义的run()方法

public class ThreadDemo extends Thread {public ThreadDemo(String name) {// 设置当前线程的名字this.setName(name);}@Overridepublic void run() {System.out.println("当前运行的线程名为: " + Thread.currentThread().getName());}public static void main(String[] args) throws Exception {// 注意这里,要调用start方法才能启动线程,不能调用run方法new ThreadDemo("MyThreadOne").start();new ThreadDemo("MyThreadTwo").start();}}

输出结果:

当前运行的线程名为: MyThreadOne
当前运行的线程名为: MyThreadTwo
 实现Runnable接口创建线程

由于Java是单继承机制,如果自己的类已经继承自另一个类,则无法再直接继承Thread类,此时,可以通过实现Runnable接口来实现多线程。

实现Runnable接口并实现其中的run方法,然后通过构造Thread实例,传入Runnable实现类,然后调用Thread的start方法即可开启一个新线程。

public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("当前运行的线程名为: " + Thread.currentThread().getName());}public static void main(String[] args) throws Exception {MyRunnable runnable = new MyRunnable();new Thread(runnable, "MyThreadOne").start();new Thread(runnable, "MyThreadTwo").start();}}

输出结果:

当前运行的线程名为: MyThreadOne
当前运行的线程名为: MyThreadTwo

线程池使用 

线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批线程,当有需要使用线程时从线程池取出,用完后放回线程池,这样避免了频繁创建与销毁线程。

核心参数

线程池的核心参数决定了池的类型,进而决定了池的特性。

参数解释行为
corePoolSize核心线程数池中长期维护的线程数量,不主动回收
maximumPoolSize最大线程数最大线程数大于等于核心线程数
keepAliveTime线程最大空闲时间非核心线程最大空闲时间,超时回收线程
workQueue工作队列工作队列直接决定线程池的类型

 Executors类默认创建线程池与参数对应关系。

线程池corePoolSizemaximumPoolSizekeepAliveTimeworkQueue
newCachedThreadPool0Integer.MAX_VALUE60SynchronousQueue
newSingleThreadExecutor110LinkedBlockingQueue
newFixedThreadPoolNN0LinkedBlockingQueue
newScheduledThreadPoolNInteger.MAX_VALUE0DelayedWorkQueue
 线程池对比
线程池特点适用场景
newCachedThreadPool超时未使用的线程回自动销毁,有新任务时自动创建适用于低频、轻量级的任务。回收线程的目的是节约线程长时间空闲而占有的资源。
newSingleThreadExecutor线程池中有且只有一个线程顺序执行任务
newFixedThreadPool线程池中有固定数量的线程,且一直存在适用于高频的任务,即线程在大多数时间里都处于工作状态。
newScheduledThreadPool定时线程池与定时调度相关联

https://segmentfault.com/a/1190000041661118

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

勘探开发人工智能应用:人工智能概述

0 提纲 机器学习、深度学习、计算机视觉等技术已在勘探开发、油气生产、炼油炼化、经营管理等重点环节进行应用与推广。请思考: 输入:数据是什么(数字、文本、图)?如何理解数据?如何清洗数据?(需要专业领域知识)输出&…

实习碎碎念

话说实习一周多了,学到的比自学一个月都多~~~加油狗子你最棒!!! 环境搭建坑死了 SSM框架环境配置 Ideamavenjdktomcatnavicat https://www.cnblogs.com/seigann/p/14528551.htmlhttps://www.cnblogs.com/seigann/p/14528551.h…

模板初阶以及string类使用

模板初阶以及string类使用 模板的简单认识1.泛型编程2.函数模板模板的原理图函数模板格式函数模板实例化非模板函数和模板函数的匹配原则 3.类模板类模板的定义格式类模板的实例化 string1.string简介2.string常用的接口 题目练习1.字符串相加2.字符串里面最后一个单词的长度3.…

【瑞吉外卖】Git部分学习

Git简介 Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件,Git仓库分为两种: 本地仓库:开发人员自己电脑上的Git仓库 远程仓库:远程服务器上的Git仓库…

CVE漏洞复现-CVE-2021-3493 Linux 提权内核漏洞

CVE-2021-3493 Linux 提权内核漏洞 漏洞描述 CVE-2021-3493 用户漏洞是 Linux 内核中没有文件系统中的 layfs 中的 Ubuntu over 特定问题,在 Ubuntu 中正确验证有关名称空间文件系统的应用程序。buntu 内核代码允许低权限用户在使用 unshare() 函数创建的用户命名…

kubernetes configmap 的data中的文件内容格式错乱

截取一段错乱的配置: kubectl -n monitoring get cm blackbox-exporter-configuration -o yaml apiVersion: v1 data:config.yml: "\"modules\":\n \"http_2xx\":\n \"http\":\n \"preferred_ip_protocol\"…

线上电影购票选座H5小程序源码开发

搭建一个线上电影购票选座H5小程序源码需要一些基本的技术和步骤。以下是一个大致的搭建过程,可以参考: 1. 确定需求和功能:首先要明确你想要的电影购票选座H5小程序的需求和功能,例如用户登录注册、电影列表展示、选座购票、订单…

【Java可执行命令】(二十一)线程快照生成工具 jstack:帮助开发人员分析和排查线程相关问题(死锁、死循环、线程阻塞...)

Java可执行命令之jstack 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 使用步骤及技巧3.3 使用案例 4️⃣ 应用场景🌾 总结 1️⃣ 概念 jstack 命令是 Java Development Kit(JDK)中提供的一项诊断工具,用于生成Java虚拟…

WHQL认证中HCK和HLK的区别

开发者或硬件制造商要通过WHQL认证获得微软数字签名或是Windows徽标的使用权限,就需要使用WHQL认证的测试工具(HCK或HLK)对硬件设备或驱动程序进行测试。HCK和HLK其实是一个系列的测试工具,HCK和HLK的主要区别是用于测试不同Windo…

pytest测试框架之fixture测试夹具详解

fixture的优势 ​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown,但相对之下它的功能更加强大和灵活。 命名方式灵活,不限于unittest的setup、teardown可以实现数据共享,多个模块跨文件共享前置后置可以实现多个模块跨…

JAVA SpringBoot 项目 多线程、线程池的使用。

1.1 线程: 线程就是进程中的单个顺序控制流,也可以理解成是一条执行路径 单线程:一个进程中包含一个顺序控制流(一条执行路径) 多线程:一个进程中包含多个顺序控制流(多条执行路径&#xff0…

前端实习周记第三周周记

第二周总结 第二周主要是做了一些PC端细节内容。大的地方改的不多,但是小的细节蛮多。 值得一提的是,第二周做的微信小程序,改了很多逻辑。改逻辑需要与后端进行联调,收获很大,思路也愈发清楚。 记录做了什么是好习…

天津农商银行智能加密锁管理工具常见问题

天津农商银行智能加密锁管理工具,在使用过程中,可能出现一些莫名的错误,针对亲身遇到的坑,分享给大家,以备不时之需。 一、转账业务导入文件中文汉字出现乱码,如下图。 原因是文件编码不正确,…

Java项目作业~ 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作

需求: 创建基于Maven的Java项目,连接数据库,实现对站点信息的管理,即实现对站点的新增,修改,删除,查询操作。 以下是站点表的建表语句: CREATE TABLE websites (id int(11) NOT N…

收钱吧与火山引擎VeDI合作一年后 有了哪些新变化?

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 收钱吧正在和火山引擎数智平台(VeDI)跑出一条业务提效新通路。 相关数据显示,收钱吧的日服务人次就近5000万,累计服务…

测评HTTP代理的透明匿名?

在我们日常的网络冒险中,你是否曾听说过HTTP代理的透明匿名特性?这些神秘的工具就像是网络世界中的隐身斗士,让我们能够在互联网的迷雾中保护自己的身份和隐私。那么,让我们一起揭开HTTP代理的面纱,探索其中的奥秘吧&a…

基于PHREEQC水文地球化学模拟实践技术应用及PhreePlot在Fe-H2O体系稳定场图绘制应用

本文以水文地球化学模拟软件PHREEQC操作为主要内容,之中强调化学热力学理论和数据库.dat、各模块以及各种模拟反应的精细讲解和实例训练,包括平衡反应模拟、化学动力模拟、反应迁移模拟等。 不仅掌握水文地球化学模拟软件PHREEQC的全过程实际操作技术的基…

el-table实现指定列合并

table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素…

【设计模式】-工厂方法模式

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个用于创建对象的接口,但是将具体对象的创建推迟到子类中。这样,子类可以决定要实例化的对象类型。工厂方法模式提供了一种方式,通…