多线程(三):Thread 类的基本属性
创始人
2025-06-01 19:19:54

上一个篇章浅浅了解了一下 线程的概念,进程与线程的区别,如何实现多线程编程。

而且上一章提到一个重要的面试点: start 方法和 run 方法的区别。

start 方法是从系统那里创建一个新的线程,这个线程会自动调用内部的run 方法;

run 方法是一个线程的执行入口,所有的实现逻辑都写在该方法里。

从概念上来说,这两个方法是属于线程的属性。我们接着这个线程属性继续来认识线程。

线程属性

就像我们之前写的代码:

我们如何让某个线程中断呢?

这里的中断意味着:让线程停下来,线程的终止。

本质上来说让线程终止的办法只有一种,让线程的入口方法 执行完毕。无论是是 return 、抛出异常还是别的方法都是执行完毕。 

这里就需要提到 给线程设定一个结束标志。

给线程设定一个结束标志

来看下面的这段代码: 

我们可以选择这种方式来控制循环,不让他写的那么死。

 但这仍是我们自己设置的变量,而不属于线程的属性,线程中也有个方法:interru方法

interru方法

我们来看看这一段代码:

 我们这里就用到了几个线程的属性, 

Thread.currentThread()、isInterrupted()、t.interrupt()

上述的e.printStackTrace() 就是打印出异常信息。 

我们来看看结果:

我们发现,在main线程睡眠了 3s 之后并没有打印完异常就结束,而是继续线程 t 的运行。

这是为什么呢?

 这就需要来聊聊 interrupt 方法的作用了:

  1. 将标识符设置为 true 
  2. 如果该线程正在阻塞状态中(例如:sleep,后面还有其他方法也会使线程阻塞),会直接被interrupt 方法唤醒,此时通过抛出异常就会让 sleep 立即结束。

按照 interrupt 方法的作用,此时应该结束了啊,t 线程这么还会继续呢?

这里有个非常重要的点;

  当 sleep 被唤醒以后,会自动将 isInterrupted 设置为 false,也就是说将异常标志位清空了(true -> false);

sleep 为什么要清空异常标志位呢?

目的是为了让这个线程能够对于线程什么时候结束有一个更精准的控制。

当前的 interrpt 方法是告诉线程你该结束了,至于什么时候结束,都是由代码灵活控制的。

interrpt 方法 是个通知而不是命令。

等待线程 -- join 方法

线程与线程之间的的并发执行的,线程间的调度是无序的,我们无法判断两个线程之间谁先结束谁后结束。

例如: 

但是我们可以通过 join 方法进行控制,例如:

 在t 执行 join 方法时,如果 t 线程尚未结束,那么main线程就会进入 Blocking (阻塞状态),因为t.join 在 main线程中执行。

main 线程代码走到这一行 就不参与 cpu 的执行调度了。

如果这个有多个线程并发执行, 那么 只是main 线程不参与线程的调度,其余的线程任然是抢占执行的。

我们使用的 join 是无参的版本,我们还存在另一个带参的版本。

这个带参的版本,参数作为等待的最大时间,超过了这个最大时间,t 线程还没有结束,那么main 线程 就会被唤醒,不再是Blocking 状态 就会继续执行。

而上面不带参的版本,就是死等,等不到 t 线程结束,mian 线程就不会开始。

既然上面都提到了线程状态,那么就简单理解一下线程状态。

线程状态

Java中线程的状态分为6种:

1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3. 阻塞(BLOCKED):表示线程阻塞于锁。
4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6. 终止(TERMINATED):表示该线程已经执行完毕。

 我们简单理解就是一条主线,三条支线。

我们就简单了解一下就好,后面还会再聊到。

简单了解线程安全

对于多线程编程雀氏提供了很多便利,我们可以再同一时间完成多个任务,相比于多进程编程多线程还降低了 cpu 资源的占用。

这几章都提到了,多线程之间的线程调度是抢占式执行的,所以在此基础之上会产生很多的线程安全问题。

本章就稍稍介绍认识一下线程安全的问题就行。

本章以一个不安全的例子来认识

例如:我们设置一个 count ,两个线程各执行 5 w 次自增运算。

代码如下:

class Count {private int count = 0;public void add() {count++;}public int get() {return count;}
}
public class demo10 {public static void main(String[] args) throws InterruptedException {Count count = new Count();Thread t1 = new Thread(() -> {for (int i = 0; i < 50000; i++) {count.add();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 50000; i++) {count.add();}});t1.start();t2.start();t1.join();t2.join();System.out.println(count.get());}
}

运行一次看看结果:

再来试试看:

 再来一次:

从结果上来看它是一个随机数。

至于为什么会产生一个随机数,我们需要了解在这执行的内部发生了什么事情:

对于这个 count++ 这个操作,本质上是由 cpu 上三个指令构成的:

  1. load : 从内存中将数据读取到 cpu 寄存器中
  2. add :在 cpu 中的值进行 + 1 运算
  3. save : 把寄存器中的值写入到内存中

由于是抢占式执行的,那么就会产生如下等问题:

这个 3 的执行顺序就变成不确定的了,产生多种排列组合结果。

只有 25 亿分之 1 的可能得到 10w 这个数字,也有可能会产生结果小于 5w 具体的可以自己排列组合看看。

对于 t1 和 t2 这两个线程可能式运行在同一个 cpu 核心上执行,也有可能在不同的 cpu 核心上执行。

归根结底,线程安全问题,全是因为线程之间的无序调度,导致了执行顺序不确定,结果不确定。

相关内容

热门资讯

篮球记录表填写方法,如何填写篮... 篮球记录表填写方法目录篮球记录表填写方法如何填写篮球比赛记录表篮球比赛违反体育道德的犯规记录表上怎么...
阳澄湖大闸蟹做法有哪些,阳澄湖... 阳澄湖大闸蟹做法有哪些目录阳澄湖大闸蟹做法有哪些阳澄湖大闸蟹怎么吃?阳澄湖大闸蟹的吃法有哪些?阳澄湖...
广州bw是什么意思,广州9号车... 广州bw是什么意思目录广州bw是什么意思广州9号车房bilibili在哪
广州市内有哪几个区,广州有几个... 广州市内有哪几个区目录广州市内有哪几个区广州有几个区广州市有哪几个区?广州市内一共分几个区?广州市内...
729车牌啥意思(729车牌号... 本篇文章极速百科给大家谈谈729车牌啥意思,以及729车牌号什么意思对应的知识点,希望对各位有所帮助...
MTV中文是什么意思(mtv什... 今天给各位分享MTV中文是什么意思的知识,其中也会对mtv什么含义进行解释,如果能碰巧解决你现在面临...
花王纸尿裤u版e版区别 极速百... 花王纸尿裤u版e版区别目录花王纸尿裤u版e版区别花王纸尿裤u版e版区别花王纸尿裤底部有u字和e字,s...
代表奋斗的成语有哪些,表示坚持... 代表奋斗的成语有哪些目录代表奋斗的成语有哪些表示坚持不懈,努力拼搏的成语有哪些?写出四个表示艰苦奋斗...
奔腾B50的油耗是多少?(奔腾... 本篇文章极速百科给大家谈谈奔腾B50的油耗是多少?,以及奔腾b50的油耗怎么样对应的知识点,希望对各...
鼓励事业低谷男人的话,鼓励事业... 鼓励事业低谷男人的话目录鼓励事业低谷男人的话鼓励事业低谷男人的话 鼓励事业低谷男人的话列述老公事业不...
陪练车哪里找汽车陪练?驾驶陪练... 本篇文章极速百科给大家谈谈陪练车哪里找汽车陪练?驾驶陪练价格表,以及汽车陪练去哪个平台对应的知识点,...
四川音乐学院是一本吗,四川音乐... 四川音乐学院是一本吗目录川音是一本还是二本?四川音乐学院是一本吗,是二本吗? 川音是一本还是二本?二...
海信电视启动不起来怎么办,海信... 海信电视启动不起来怎么办目录海信电视启动不起来怎么办海信电视机启动不了怎么办海信液晶电视无法正常开机...
豆豆鞋配什么裤子好看,豆豆鞋穿... 豆豆鞋配什么裤子好看目录豆豆鞋配什么裤子好看豆豆鞋穿什么裤子搭配好看那个红色豆豆鞋搭配什么裤子好看豆...
五大洲四大洋(五大洲四大洋八方... 本篇文章极速百科给大家谈谈五大洲四大洋,以及五大洲四大洋八方聚对应的知识点,希望对各位有所帮助,不要...
拌面的酱汁怎么做好吃,拌面酱怎... 拌面的酱汁怎么做好吃目录拌面的酱汁怎么做好吃拌面酱怎么做简单又好吃拌面的拌酱怎么做好吃拌面的酱料怎么...
油价调整消息:明日国内油价或将... 今天给各位分享油价调整消息:明日国内油价或将下调,车主喜讯!的知识,其中也会对明日油价上涨进行解释,...
汽车汽油泵损坏有什么症状,汽油... 汽车汽油泵损坏有什么症状目录汽车汽油泵损坏有什么症状汽油泵坏了通常有什么异常现象汽油泵坏了有什么症状...
狗狗为什么跟疯了似的来回跑 极... 狗狗为什么跟疯了似的来回跑目录狗狗为什么跟疯了似的来回跑狗狗为什么跟疯了似的来回跑小狗有时像疯了一样...
在支付宝上怎么贷款,支付宝贷款... 在支付宝上怎么贷款目录在支付宝上怎么贷款支付宝贷款在哪里 支付宝贷款怎么申请在支付宝上怎么贷款在支付...
赛艇运动起源于哪个国家,奥运会... 赛艇运动起源于哪个国家目录赛艇运动起源于哪个国家奥运会传统比赛项目“赛艇”起源于欧洲哪个国家?赛艇运...
时空猎人首充号为什么充值会打折... 时空猎人首充号为什么充值会打折目录时空猎人首充号为什么充值会打折安卓手游充值折扣平台安卓手游充值折扣...
自助无人洗车机多少钱一台(24... 今天给各位分享自助无人洗车机多少钱一台的知识,其中也会对24小时自助共享洗车店要多少钱进行解释,如果...
白粥的做法,白粥的做法,白粥怎... 白粥的做法目录白粥的做法白粥的做法,白粥怎么做好吃,白粥的家常做法怎样煮白粥啊?白粥的做法 制...
包含抖音很火的叫爸爸是什么梗的... 今天给各位分享抖音很火的叫爸爸是什么梗的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别...
深圳欢乐谷的门票是怎么收费得,... 深圳欢乐谷的门票是怎么收费得目录深圳欢乐谷的门票是怎么收费得2022深圳欢乐谷万圣节老人免费吗?深圳...
阴阳师青蛙瓷器哪里多 极速百科... 阴阳师青蛙瓷器哪里多目录阴阳师青蛙瓷器哪里多阴阳师青蛙瓷器哪里多阴阳师的青蛙瓷器在哪个副本出现青蛙瓷...
一个G流量是多少MB流量,手机... 一个G流量是多少MB流量目录一个G流量是多少MB流量1G上网流量是多少MB一个G的流量等于多少MB一...
道台是什么官职 极速百科网 极... 道台是什么官职目录道台是什么官职道台是什么官职在清朝道台是个什么官“道台”是官职名吗道台是什么官职 ...
描写可怕的笑的成语笑得阴险可怕... 描写可怕的笑的成语笑得阴险可怕目录描写可怕的笑的成语笑得阴险可怕描写阴险的笑的成语表示阴险的笑有哪些...