0
点赞
收藏
分享

微信扫一扫

线程状态分析

海滨公园 2022-04-27 阅读 132
java

线程状态

线程从创建并启动到消亡共经历了 5 种状态:新建、就绪、运行、阻塞和死亡。

sleep方法

Thread 类中定义的方法,可以阻塞当前线程,是静态方法。sleep(long)让当前线程休眠等待指定的时间,时间单位为 ms。休眠时间的准确性依赖于操作系统时钟和 CPU 调度机制。如果需要可以通过 interrupt 方法来唤醒休眠的线程。

特征:不释放已经获取到的锁

wait方法

wait 方法是在 Object 类中定义的方法,作用是使当前线程进入等待队列,同时它会使当前线程释放所持有的锁。直到有其它线程调用此对象的 notify 或者 notifyAll 方法进行唤醒。

wait 无限制等待,wait(long)定时等待。wait 方法在使用时语法要求必须在同步上下文中调用。必须是同步方法或者同步代码块。

join方法

主要作用是进行线程的同步处理,可以使得线程之间的并行执行转换为串行执行。

join 方法的底层实现是通过 wait 方法实现的,所以 join 方法会自动释放锁的特点。

yield方法

静态方法可以让当前正在运行的线程暂停,但是不会阻塞线程,仅仅是让出 CPU,当前线程进入就绪态,给其它线程执行的机会,但是具体哪个线程运行取决于线程调度器,很有可能下次运行的还是当前线程。

主要作用是让相同优先级的线程之间能适当的轮转执行,但是实际中无法保证 yield 达到让步的目的,因为让步的线程还是有可能被线程调度器再次选中。

多线程的调度机制

多线程并发运行在宏观上看是同时运行,实际上是各个线程轮流获取 CPU 使用权才能执行指令。所谓线程的调度就是按照特定的机制为多个线程分配 CPU 的使用权。主要有 2 种调度模型:分时调度模型和抢占式调度模型。Unix 系统采用的是时间片算法,windows 属于抢占式。

线程的优先级

Java 采用的是抢占式的调度机制,提供了一个线程调度器来监控程序启动后进入就绪态的所有线程,线程调度器会按照线程的优先级决定应该调度哪个线程执行。

线程的优先级采用数字表示,从 1 到 10,默认值为 5。但是需要注意的是:优先级的具体实现需要依赖于操作系统,所以 Java 中的优先级需要映射到操作系统上,可能会出现操作系统中的优先级数量比较少,Java中的多个优先级会映射到同一个操作系统的优先级

setPriority(int):void 设置线程的优先级

getPriority():int 获取线程的优先级

线程同步

错误的情况一般是由于系统的线程调度具有一定的随机性造成的,需要杜绝可能出现的错误问题

1、线程的执行顺序不可重现,但是执行结果必须是可重现。

2、线程的共享数据操作不完整性就一定会出现数据被破坏,而导致结果无法预知的问题--线程的安全性问题

Java 存在两种内建的 synchronized 语法。引入 synchronized 可以将并行的操作改为串行执行,当然会影响代码的执行效率,执行速度也会受到影响。synchronized 操作线程的阻塞,也就是由操作系统控制 CPU 的内核进行上下文的切换,这个切换也是比较耗时的,所以使用 synchronized 会降低程序的运行效率。

举报

相关推荐

0 条评论