Thread笔记

Thread为Java中线程类

Thread属性:优先级,线程组,线程名,Runnable对象,状态

一状态:

线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)

二、

上下文切换

  对于单核CPU来说(对于多核CPU,此处就理解为一个核),CPU在一个时刻只能运行一个线程,当在运行一个线程的过程中转去运行另外一个线程,这个叫做线程上下文切换(对于进程也是类似)。

由于可能当前线程的任务并没有执行完毕,所以在切换时需要保存线程的运行状态,以便下次重新切换回来时能够继续切换之前的状态运行。举个简单的例子:比如一个线程A正在读取一个文件的内容,正读到文件的一半,此时需要暂停线程A,转去执行线程B,当再次切换回来执行线程A的时候,我们不希望线程A又从文件的开头来读取。

  因此需要记录线程A的运行状态,那么会记录哪些数据呢?因为下次恢复时需要知道在这之前当前线程已经执行到哪条指令了,所以需要记录程序计数器的值,另外比如说线程正在进行某个计算的时候被挂起了,那么下次继续执行的时候需要知道之前挂起时变量的值时多少,因此需要记录CPU寄存器的状态。所以一般来说,线程上下文切换过程中会记录程序计数器、CPU寄存器状态等数据。

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

  虽然多线程可以使得任务执行的效率得到提升,但是由于在线程切换时同样会带来一定的开销代价,并且多个线程会导致系统资源占用的增加,所以在进行多线程编程时要注意这些因素。

三、方法

start:开始执行run

run:实现要执行的任务

sleep:线程进入阻塞,但不释放锁

yield(放弃):让当前CPU交出执行权限,让系统的线程调度器重新调度,线程重新进入就绪状态。CPU会先去执行优先级更高的线程。同样不释放锁,但不是进入阻塞,而是重新进入就绪状态,等待重新获取CPU时间

join:执行thread.join(),会暂停当前线程,会进入执行thread,执行完thread后,返回原来线程继续执行

interrupt:可以中断处于阻塞状态的线程(通过改变中断标志位),非阻塞线程可以通过isInterrupted来判断中断标志位是否被interrupt改变

interrupted():获取中断状态,并清除中断(置为false)

stop:已废弃,不安全方法,中断run执行,抛出ThreadDeath异常

currentThread:获取当前线程

getId:获取线程ID

getName,SetName:获取设置线程名

getDaemon ,setDaemon:获取设置是否为守护线程

守护线程:守护线程依赖于创建它的线程,用户线程则不用。创建它的线程消亡,守护线程也会消亡,用户线程则会执行完毕

 

 

参考:https://www.cnblogs.com/albertrui/p/8391447.html

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值