博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Thread类的使用
阅读量:6838 次
发布时间:2019-06-26

本文共 1056 字,大约阅读时间需要 3 分钟。

hot3.png

1.线程的状态

创建new,就绪runnable,运行running, 阻塞blocked,等待time waiting,时间等待waiting,消亡dead

创建:用户创建一个线程

就绪:创建完线程不会立即进入就绪状态,需要为线程分配内存空间,等到满足所有就绪条件后,才会进入就绪状态。

运行:进入就绪状态后,需要等待获取CPU执行时间,得到CPU执行时间后,才会进入运行状态。

阻塞:运行过程中,同步块被阻塞的话会进入阻塞状态

时间等待:运行过程中,用户主动让线程睡眠的话,进入时间等待

等待:运行过程中,用户让线程等待的话,进入等待

消亡:线程执行完毕或者突然中断,就会被消亡

2.上下文切换

对于单核CPU来说,CPU在一个时刻只能运行一个线程,在 运行一个线程的过程中,转去运行另一个线程,就叫上下文切换。

上下文切换时,线程需要保存线程的运行状态,以便下次切换回来的时候继续切换之前的状态运行。

在冯诺伊曼结构的计算机中,是由CPU的控制器执行指令,每执行一条指令,程序计数器记录指令运行到哪,所以需要保存程序计数器和CPU寄存器的状态。

上下文切换就是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。

3.Thread类中的方法

start

开启一个线程

run

启动线程后,线程获得了CPU执行时间,就会执行run中的代码。

继承Thread类,需要重写run方法。

sleep

让线程睡眠,线程进入时间等待的状态。

交出CPU,CPU去执行其他任务。 如果当前线程持有对象锁,不会释放锁,相当于线程阻塞。

yield

调用yield方法会让当前线程交出CPU,不会交出锁。

和sleep区别:

1.不能控制具体交出CPU的时间。yield会让线程进入就绪状态,只要获得CPU就能执行。sleep在等待时间内是阻塞的。 2.yield只能让同等或更高优先度的线程获得CPU,sleep没有限制。

join

主线程中,调用无参join,会让主线程等待直到线程任务执行完毕。 调用有参join,就会等待一段时间。

本质是object.wait方法,会交出CPU, 释放锁

interrupt

阻塞线程调用interrupt的话,会抛出异常来中断阻塞线程。

本质是把中断标志设为true。调用isInterrupted()就能够判断中断标记的状态。

stop,destory

废弃方法。

转载于:https://my.oschina.net/u/3371784/blog/2960546

你可能感兴趣的文章
C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型
查看>>
phpcurl 请求Chunked-Encoded data 遇到的一个问题
查看>>
ASPX页面中不放置Form元素的问题
查看>>
docker~Dockerfile优化程序的部署
查看>>
你可能不需要一个 JavaScript 框架(二)
查看>>
【Android】显示Emoji表情字符
查看>>
C++ Exercises(十八)
查看>>
21.5. 流量控制
查看>>
WSRP调用中的一些问题
查看>>
Android 正则表达式
查看>>
5.22. Spring boot with Cache
查看>>
[裴礼文数学分析中的典型问题与方法习题参考解答]4.3.13
查看>>
string Join
查看>>
flaskr 报错及其修改
查看>>
[唐诗]入朝洛堤步月-上官仪
查看>>
ORACLE SQL开发where子句之case-when
查看>>
姚期智:这是一个“前所未有”的金融科技与计算机科学的黄金时代
查看>>
Linux 批量依赖库拷贝(ldd)
查看>>
memcache和redis对比
查看>>
ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
查看>>