初级+进阶+高级!带你搞懂Java开发线程特点知识

沙海 2021年6月3日12:03:24Java评论114字数 2808阅读9分21秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/29015.html

线程名程序中的每个线程都有一个名字,创建线程的时候会给它分配一个简单的Java字符串来作为线程名。线程优先级线程还有一个有意思的属性优先级。如果把一个线程设置成守护线程,那么它所创建的所有线程都会被标记成守护线程。换个角度来说,如果一个正在执行某个操作的线程必须要正确地关闭掉否则就会出现不好的后果的话,那么这个线程就应该是用户线程。如果某个线程只会在某个核上运行,那么它的数据恰好在缓存里的概率就大大提高了。文章源自JAVA秀-https://www.javaxiu.com/29015.html

原文约 2303 | 图片 7 | 建议阅读 5 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/29015.html

初级+进阶+高级!带你搞懂Java开发线程特点知识

黑马程序员视频库 文章源自JAVA秀-https://www.javaxiu.com/29015.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/29015.html

#Java干货文章源自JAVA秀-https://www.javaxiu.com/29015.html

3个文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

 黑马视频号 文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

今天,播妞和大家分享的是Java开发线程特点基础知识,不管是初学者还是高级用户或者是Java专家都需要了解,一起来学习吧!文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

 Java开发线程特点基础知识 文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

· 初学者阶段文章源自JAVA秀-https://www.javaxiu.com/29015.html

1、线程名文章源自JAVA秀-https://www.javaxiu.com/29015.html

程序中的每个线程都有一个名字,创建线程的时候会给它分配一个简单的Java字符串来作为线程名。默认的名字是”Thread-0″, “Thread-1″, “Thread-2″等。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

线程名可变,可在运行时修改它的名字,而不用在初始化的时候就指定好。name字段其实是一个简单的字符串对象,它能达到2³¹-1个字符那么长足够用了。这个名字并不是一个唯一性的标识,因此不同的线程也可以拥有同样的线程名。还有一点不要把null用作线程名否则会抛出异常。文章源自JAVA秀-https://www.javaxiu.com/29015.html

使用线程名来调试问题:文章源自JAVA秀-https://www.javaxiu.com/29015.html

既然可以设置线程名,如果遵循一定的命名规则出问题的时候排查起来就能更容易。在处理用户请求的时候可以将事务ID追加到线程名后面,能减少排查问题的时间。文章源自JAVA秀-https://www.javaxiu.com/29015.html

2. 线程优先级文章源自JAVA秀-https://www.javaxiu.com/29015.html

线程还有一个有意思的属性优先级。线程的优先级介于1 (MINPRIORITY)到10 (MAXPRIORITY)之间,主线程默认是5(NORM_PRIORITY)。每个新线程都默认继承父线程的优先级,如果没设置过,所有线程的优先级都是5。这个是通常被忽视的属性,可以通过getPriority()与setPriority()方法来获取及修改它的值。线程的构造函数里是没有这个功能。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

什么地方会用到优先级?文章源自JAVA秀-https://www.javaxiu.com/29015.html

不是所有的线程都是平等的,有的线程需要立即引起CPU重视,而有些线程则只是后台任务。优先级就是用来把这些告诉给操作系统的线程调度器。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

在Takipi中开发的一错误跟踪及排查的工具,负责处理用户异常的线程的优先级是MAX_PRIORITY,而那些只是在上报新的部署情况的线程,优先级就要低一些。优先级高的线程从JVM的线程调度器那得到的时间会多一些,但其实并非是这样的。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

在操作系统层面每一个新线程都会对应一个本地线程,所设置的Java线程的优先级会被转化成本地线程的优先级,这个在各个平台上不一样。在Linux上可以打开“-XX:+UseThreadPriorities”选项来启用这项功能。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

线程优先级只是所提供的一个建议,和Linux本地的优先级相比Java线程的优先级并不能覆盖全所有的级别(Linux共有1到99个优先级,线程的优先级在是-20到20之间)。最大的好处所设定的优先级能在每个线程获得的CPU时间上有所体现,不过完全依赖于线程优先级的做法不推荐。文章源自JAVA秀-https://www.javaxiu.com/29015.html

初级+进阶+高级!带你搞懂Java开发线程特点知识文章源自JAVA秀-https://www.javaxiu.com/29015.html

· 进阶阶段文章源自JAVA秀-https://www.javaxiu.com/29015.html

3、线程本地存储文章源自JAVA秀-https://www.javaxiu.com/29015.html

ThreadLocal是在Thread类之外实现的一个功能(java.lang.ThreadLocal),但它会为每个线程分别存储一份唯一的数据。正如它的名字所说的,它为线程提供了本地存储,也就是说所创建出来变量对每个线程实例来说都是唯一的。和线程名,线程优先级类似可以自定义出一些属性,像存储在Thread线程内部一样。文章源自JAVA秀-https://www.javaxiu.com/29015.html

全局变量不是什么好事文章源自JAVA秀-https://www.javaxiu.com/29015.html

ThreadLocal可以用来存储事务ID。如果代码中出现未捕获异常的时候它就相当有用了,最佳实践是设置一个UncaughtExceptionHandler,这个是Thread类本身就支持的,但是得自己去实现一下这个接口。一旦执行到了UncaughtExceptionHandler里,几乎没有任何线索能够知道到底发生了什么事情了。文章源自JAVA秀-https://www.javaxiu.com/29015.html

这会儿能获取到的就只有Thread对象,之前导致异常发生的所有变量都无法再访问了,因为那些栈帧都已经被弹出了。一旦到了UncaughtExceptionHandler里,这个线程就只剩下最后一口气了,唯一能抓住的最后一根稻草就是ThreadLocal。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

4、用户线程及守护线程文章源自JAVA秀-https://www.javaxiu.com/29015.html

Thread类。程序中的每个线程都会有一个状态,是用户状态或是守护状态。换句话说,前台线程或是后台线程,主线程默认是用户线程,每个新线程都会从创建它的线程中继承线程状态。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

如果把一个线程设置成守护线程,那么它所创建的所有线程都会被标记成守护线程。如果程序中的所有线程都是守护线程的话,那么这个进程便会终止。可以通过Boolean .setDaemon(true)和.isDaemon()方法来查看及设置线程状态。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

什么时候会用到守护线程?文章源自JAVA秀-https://www.javaxiu.com/29015.html

如果进程不必等到某个线程结束才能终止,那么这个线程就可以设置成守护线程。这省掉了正常关闭线程的那些麻烦事,可以立即将线程结束掉。换个角度来说,如果一个正在执行某个操作的线程必须要正确地关闭掉否则就会出现不好的后果的话,那么这个线程就应该是用户线程。通常都是些关键的事务,比方说,数据库录入或者更新这些操作不能中断。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

初级+进阶+高级!带你搞懂Java开发线程特点知识文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

· 高级阶段文章源自JAVA秀-https://www.javaxiu.com/29015.html

5、处理器亲和性文章源自JAVA秀-https://www.javaxiu.com/29015.html

这里要讲的会更靠近硬件,当软件遇上了硬件。处理器亲和性使得能够将线程或者进程绑定到特定的CPU核上。这意味着只要是某个特定的线程,肯定只会在某个特定的CPU核上执行。通常来讲如何绑定是由操作系统的线程调度器根据它自己的逻辑来决定的,它很可能会将前面提到的线程优先级也一并考虑进来。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

这么做的好处在于CPU缓存。如果某个线程只会在某个核上运行,那么它的数据恰好在缓存里的概率就大大提高了。如果数据正好就在CPU缓存里,那么就没有必要重新再从内存里加载了。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

所节省的这几毫秒时间就能用在刀刃上,在这段时间里代码可以马上开始执行,也就能更好地利用所分配给它的CPU时间。当然了,操作系统层面可能会存在某种优化,硬件架构当然也是个很重要的因素,但利用了处理器的亲和性至少能够减小线程切换CPU的机率。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

由于掺杂着多种因素处理器亲和性到底对吞吐量有多大的影响,最好还是通过测试的方式来进行证明。也许这个方法并不是总能显著地提升性能,但至少有一个好处就是吞吐量会相对稳定。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

亲和策略可以细化到非常细的粒度上取决于具体想要什么,高频交易行业便是这一策略最能大显身手的场景之一。文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

初级+进阶+高级!带你搞懂Java开发线程特点知识文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

更多干货知识文章源自JAVA秀-https://www.javaxiu.com/29015.html

关注黑马程序员视频库文章源自JAVA秀-https://www.javaxiu.com/29015.html

???文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

· 推荐阅读 ·文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

一个时代的终结:微软宣布退役IE浏览器!网友表示:脱离苦海?文章源自JAVA秀-https://www.javaxiu.com/29015.html

2021-05-22文章源自JAVA秀-https://www.javaxiu.com/29015.html

初级+进阶+高级!带你搞懂Java开发线程特点知识文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

内卷人的「高端摸鱼」操作!程序员用了都说好!文章源自JAVA秀-https://www.javaxiu.com/29015.html

2021-05-19文章源自JAVA秀-https://www.javaxiu.com/29015.html

初级+进阶+高级!带你搞懂Java开发线程特点知识文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

当程序员和产品经理开始凡尔赛,万万没想到...文章源自JAVA秀-https://www.javaxiu.com/29015.html

2021-05-17文章源自JAVA秀-https://www.javaxiu.com/29015.html

初级+进阶+高级!带你搞懂Java开发线程特点知识文章源自JAVA秀-https://www.javaxiu.com/29015.html

文章源自JAVA秀-https://www.javaxiu.com/29015.html

初级+进阶+高级!带你搞懂Java开发线程特点知识文章源自JAVA秀-https://www.javaxiu.com/29015.html

点个在看,播妞爱你们呦文章源自JAVA秀-https://www.javaxiu.com/29015.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定