Java这些多线程基础知识你会吗?

0、并发和并行、进程核线程、多进程和多线程的区别:

(这里的时间和时刻上的概念同物理上的一样)

并发:在一段时间内多个任务同时执行,或者说是在一段很短的时间内可以执行多条程序指令,微观上看起来好像是可以同时运行多个进程,单核处理器就可以做到。

并行:在同一时刻多个任务同时执行,或者说是在同一时刻可以执行多条程序指令,多核处理器才可以做到。

进程:进程是程序的一次执行过程,是系统运行程序的基本单位,打开 Windows 的任务管理器就可以看到很多进程。

线程:线程与进程相似,但线程是一个比进程更小的执行单位,一个进程在其执行的过程中可能产生多个线程。

多进程:每个进程都拥有自己独立的资源,多个进程可在单核处理器上并发执行,在多核处理器上并行执行。

多线程:一个进程可由多个线程组成,多个线程共享进程内资源,多个线程可在单核处理器上并发执行,在多核处理器并行执行。

在多核处理器上,并发和并行同时存在,处理器上的每个核同一时刻同时执行多个任务,每个核在很短的时间段内又同时执行多个任务,对多任务粗略划分是多个进程,对进程划分可能又是多个线程。同一时刻,处理器的每个核只能运行一个进程中的一个线程中的一条指令(Intel 的超线程技术,如双核四线程,四核八线程,处理器的线程(硬件上)和进程中的线程(软件上)不是一个概念,这个所谓的超线程技术也并不能达到真正的多核,只是尽可能的提高处理器的吞吐量核利用率)。

线程比进程更加的轻量级,进程和线程都是提高程序并发性和系统性能的手段,但并不是说进程越多或线程越多,性能越高,还要结合硬件设备和操作系统来看。

1、创建线程的三种方式:

继承 Thread 类,覆写父类中的 run() 方法,新线程类创建线程

实现 Runnable 接口,实现接口中的 run() 方法,Thread 类创建线程

实现 Callable 接口,FutureTask 类构造创建方法体,Thread 类创建线程

(扫一扫即可查看测试代码)

2、三种方式的优劣:

3、线程的六种状态:

Thread.State 枚举类中的定义

NEW:还没开始运行的线程处于这种状态

RUNNABLE:在 Java 虚拟机中可运行的线程(正在运行也可能没在运行)处于这种状态

BLOCKED:被阻塞而等待监视锁的线程处于这种状态

WAITING:无限期的等待另一个线程执行特定方法的线程处于这种状态

TIMED_WAITING:在指定等待时间内等待另一个线程执行特定的方法的线程处于这种状态

TERMINATED:已经退出(运行结束)的线程处于这种状态

4、线程的生命周期:

5、线程的分类:

1、普通线程:前台线程

2、守护线程:

后台线程,运行在后台为其他线程提供服务,如果所有的前台线程都死亡,后台线程也自动死亡。当整个虚拟机中只剩下后台线程,虚拟机也没有继续运行的必要了,虚拟机也就退出了。

应用:JVM 虚拟机启动后的后台检测线程,数据库连接池中的检测线程。

最常见的守护线程:虚拟机中的垃圾回收线程,可以通过 jconsole,jvisualvm 等工具查看。

6、线程中的常用方法说明:

start():

在使用 new 关键字创建一个线程后(New 状态),并不表现出任何的线程活动状态(非 New、Terminated 状态,可以使用 isAlive 方法检测线程的活动状态),CPU 也不会执行线程中的代码。

只有在 start() 方法执行后,才表示这个线程可运行了(Runnable 状态),至于何时真正运行还要看线程调度器的调度。

在线程死亡后,不要再次调用 start() 方法。只能对新建状态的线程调用且只能调用一次 start() 方法,否则将抛出 IllegalThreadStateException 异常。

run():

启动线程是 start() 方法,而不是 run() 方法。

如果直接调用 run() 方法,这个线程中的代码会被立即执行,多个线程就无法并发执行了。

join():

等待该线程完成的方法,其他线程将进入等待状态(Waiting 状态),通常由使用线程的程序(线程)调用,如将一个大问题分割为许多小问题,要等待所有的小问题处理后,再进行下一步操作。

sleep():

主动放弃占用的处理器资源,该线程进入阻塞状态(Blocked 状态),指定的睡眠时间超时后,线程进入就绪状态(Runnable),等待线程调度器的调用。

yield():

主动放弃占用的处理器资源,线程直接进入就绪状态(Runnable),等待线程调度器的调用。

可能的情况是当线程使用 yield 方法放弃执行后,线程调度器又将该线程调度执行。

interrupt():

没有任何强制线程终止的方法,这个方法只是请求线程终止,而实际上线程并不一定会终止,在调用 sleep() 方法时可能会出现 InterruptedException 异常,你可能会想在异常捕获后(try-catch语句中的catch)请求线程终止,而更好的选择是不处理这个异常,抛给调用者处理,所以这个方法并没有实际的用途,还有 isInterrupted() 方法检查线程是否被中断。

setDaemon():

设置守护进程,该方法必须在 start() 方法之前调用,判断一个线程是不是守护线程,可以使用 isDaemon() 方法判断。

setPriority():

设置线程的优先级,理论上来说,线程优先级高的线程更容易被执行,但也要结合具体的系统。

每个线程默认的优先级和父线程(如 main 线程、普通优先级)的优先级相同,线程优先级区间为 1~10,三个静态变量:MIN_PRIORITY = 1、NORM_PRIORITY = 5、MAX_PRIORITY = 10。

使用 getPriority() 方法可以查看线程的优先级。

isAlive():

检查线程是否处于活动状态,如果线程处于就绪、运行、阻塞状态,方法返回 true,如果线程处于新建和死亡状态,方法返回 false。

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

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

相关文章

MySQL set names 命令_mysql set names 命令和 mysql 字符编码问题

先看下面的执行结果:(rootlocalhost)[(none)]mysql>show variables like character%;---------------------------------------------------------------------------------------| Variable_name | Value |---------------------------------------------------…

设置Proxy Server和SQL Server实现数据库安全

首先,我们需要了解一下SQL Server在WinSock上定义协议的步骤: 1. 在”启动”菜单上,指向”程序/Microsoft Proxy Server”,然后点击”Microsoft Management Console”。 2. 展开”Internet Information Service”,再展开运行Proxy…

Python django解决跨域请求的问题

解决方案 1.安装django-cors-headers pip3 install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS [...corsheaders,...] MIDDLEWARE_CLASSES (...corsheaders.middleware.CorsMiddleware,django.middleware.common.CommonMiddleware, # 注意顺序...…

加勒比海兔_加勒比海海洋物种趋势

加勒比海兔Ok, here’s a million dollar question: is the Caribbean really dying? Or, more specifically, are marine species found on Caribbean reefs becoming less abundant?好吧,这是一个百万美元的问题:加勒比海真的死了吗? 或者…

mysql 查出相差年数_MySQL计算两个日期相差的天数、月数、年数

MySQL自带的日期函数TIMESTAMPDIFF计算两个日期相差的秒数、分钟数、小时数、天数、周数、季度数、月数、年数,当前日期增加或者减少一天、一周等等。SELECT TIMESTAMPDIFF(类型,开始时间,结束时间)相差的秒数:SELECT TIMESTAMPDIFF(SECOND,1993-03-23 0…

tornado 简易教程

引言 回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有一个对应的线程来用web应用(如Djang…

如果你的电脑是通过代理上网的.就要用端口映射

由于公网IP地址有限,不少ISP都采用多个内网用户通过代理和网关路由共用一个公网IP上INTERNET的方法, 这样就限制了这些用户在自己计算机上架设个人网站,要实现在这些用户端架设网站,最关键的一点是, 怎样把多用户的内网…

人口密度可视化_使用GeoPandas可视化菲律宾的人口密度

人口密度可视化GeoVisualization /菲律宾。 (GeoVisualization /Philippines.) Population density is a crucial concept in urban planning. Theories on how it affects economic growth are divided. Some claim, as Rappaport does, that an economy is a form of “spati…

Unity - Humanoid设置Bip骨骼导入报错

报错如下: 解决: 原因是biped骨骼必须按照Unity humanoid的要求设置,在max中设置如下: 转载于:https://www.cnblogs.com/CloudLiu/p/10746052.html

python3openpyxl无法打开文件_Python3 处理excel文件(openpyxl库)

openpyxl 介绍openpyxl是一个用于读/写 XLSX/XLSM/XLTX/XLTM文件的python库。openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件;2007一下的版本为xls后缀的文件,需要使用 xlrd和xlwt库进行操作。虽然xlrd和xlwt也可以进行文件读写&…

Kubernetes - - k8s - v1.12.3 OpenLDAP统一认证

1,基本概念 为了方便管理和集成jenkins,k8s、harbor、jenkins均使用openLDAP统一认证。2,部署openLDAP 根据之前的文档,openLDAP使用GFS进行数据持久化。下载对应的openLDAP文件git clone https://github.com/xiaoqshuo/k8s-clust…

给程序加壳

在内存中运行可执行程序,好处是可以给程序加壳,加密源程序,静态反汇编无法获得PE输入节,但是因为运行后仍然是独立的进程,所以没办法防止远程线程注入,挂接API钩子。 typedef IMAGE_SECTION_HEADER ( * PIM…

srpg 胜利条件设定_英雄联盟获胜条件

srpg 胜利条件设定介绍 (Introduction) The e-sports community has been growing rapidly in the past few years, and what used to be a casual pastime has morphed into an industry projected to generate $1.8 B in revenue by 2022. While there are many video games …

[Egret][文档]遮罩

——遮罩的作用是指定一个显示对象的可见区域,即这个显示对象只在这个区域可见。 一、矩形遮罩 将一个矩形对象赋值给显示对象的 mask 属性。 shp.mask new egret.Rectangle(20,20,30,50); 【注】:这个矩形的坐标(20,20)和(30,50)是相对于被遮罩对象shp…

clob类型字段最大存储长度_请教oracle的CLOB字段的最大长度?

CLOB和BLOB都是4G,而LONG ,LONG raw是旧时代的oracle二进制和长文本表示,将来会被废弃。最长长度是2G.单位是Byte表中单个 LOB 字段 在 9i 版本中可保存 4GB 数据, 在 10g 版本中可保存多达 128TB 的数据.所以理论上是没限制的ORACLE的数据类型-- ORAC…

JdbcUtil

转自:https://github.com/ghyg525/util_java_jdbc JdbcUtil.java import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; …

机器学习 综合评价_PyCaret:机器学习综合

机器学习 综合评价Any Machine Learning project journey starts with loading the dataset and ends (continues ?!) with the finalization of the optimum model or ensemble of models for predictions on unseen data and production deployment.任何机器学习项目的旅程都…

silverlight 3D 游戏开发

http://www.postvision.net/SilverMotion/DemoTech.aspx silverlight 3D 游戏开发 时间:2010-10-22 06:33来源:开心银光 作者:黎东海 点击: 562次意外发现一个silverlight的实时3D渲染引擎。性能比开源那些强很多。 而且支持直接加载maya,3Dmax等主流3D模型文件。 附件附上它的…

redis终端简单命令

keys * 获取所有键lRange hongbao:44 0 -1获取该键的所有值del hongbao:44 删除该键的所有值 hgetAll user:44 获取该键的所有队列hget hongbao:44 8 获取该队列用户为8的值hset hongbao:44 7 asdf设置该队列用户为7的值hdel user:44 8 删除该队列用户为8的值 flushall 清空red…

python中ix用法_Python中使用ix的数据帧子集

您可以使用X[var2].iloc[[0,1]]:In [280]: X[var2].iloc[[0,1]]Out[280]:0 NaN4 9Name: var2, dtype: float64由于X[var2]是X的视图,因此X[var2].iloc[[0,1]]对两者都是安全的访问和分配。但是如果你使用这种“链式索引”要小心模式(例如这里使用的index…