Java并发(七)----线程sleep、yield、线程优先级

news/2024/11/27 12:58:15/

1、sleep 与 yield

sleep

  1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)

  2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException

  3. 睡眠结束后的线程未必会立刻得到执行

  4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性(TimeUnit.SECONDS.sleep(1);)

调用sleep

    public static void main(String[] args) {Thread t1 = new Thread("t1") {@Overridepublic void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}};
​t1.start();log.debug("t1 state: {}", t1.getState());
​try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}log.debug("t1 state: {}", t1.getState());}

输出

22:23:02.365 c.Test6 [main] - t1 state: RUNNABLE
22:23:02.893 c.Test6 [main] - t1 state: TIMED_WAITING

调用interrupt

    public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread("t1") {@Overridepublic void run() {log.debug("enter sleep...");try {Thread.sleep(2000);} catch (InterruptedException e) {log.debug("wake up...");e.printStackTrace();}}};t1.start();
​Thread.sleep(1000);log.debug("interrupt...");t1.interrupt();}

输出

22:26:48.155 c.Test7 [t1] - enter sleep...
22:26:49.158 c.Test7 [main] - interrupt...
22:26:49.158 c.Test7 [t1] - wake up...
java.lang.InterruptedException: sleep interruptedat java.lang.Thread.sleep(Native Method)at cn.itcast.test.Test7$1.run(Test7.java:14)

yield

  1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程,注意:如果没有其他线程的话,可能还是执行当前线程

  2. 具体的实现依赖于操作系统的任务调度器

2、sleep yield区别

共同点:

1.都是Thread类中的类方法

2.都会导致正在执行的线程释放CPU

区别:

1.线程进入的状态不同:sleep方法导致线程进入到阻塞状态,yield方法导致线程进入就绪状态

2.是否考虑线程优先级:sleep方法不会考虑线程优先级,当一个线程调用sleep方法释放CPU后,所有优先级级别的线程都有机会获得CPU。yield方法会考虑线程优先级。当一个线程调用sleep方法释放CPU后,与该线程具有同等优先级,或优先级比该线程高的线程有机会获得CPU

3.可移植性:sleep方法比yield方法具有更好的可移植性

4.是否抛出异常:sleep方法声明抛出InterruptedException,而yield方法没有声明任何异常

5.是否有参数:sleep方法在Thread类中有两种重载形式,sleep(long ms),sleep(long ms,int nanos)yield方法没有参数

3、线程优先级

  • 线程优先级会提示(hint)调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它

  • 如果 cpu 比较忙,那么优先级高的线程会获得更多的时间片,但 cpu 闲时,优先级几乎没作用

所以不一定优先级设置高就一定能有限执行,具体执行依赖任务调度器。

Runnable task1 = () -> {int count = 0;for (;;) {System.out.println("---->1 " + count++);}
};
Runnable task2 = () -> {int count = 0;for (;;) {// Thread.yield();System.out.println("              ---->2 " + count++);}
};
Thread t1 = new Thread(task1, "t1");
Thread t2 = new Thread(task2, "t2");
// t1.setPriority(Thread.MIN_PRIORITY);
// t2.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();

这里读者可将注释去掉自行实践,即可体会yield与优先级的使用。


http://www.ppmy.cn/news/108747.html

相关文章

QSettings Class

QSettings类 QSettings类公共类型&#xff08;枚举&#xff09;公有成员函数静态成员函数函数作用这个类写文件的特征 QSettings类 QSettings类提供持久的独立于平台的应用程序设置。 头文件:#include< QSettings >qmake:QT core继承&#xff08;父&#xff09;:QObje…

Unity---委托与事件

目录 1.委托和事件在使用上的区别是什么&#xff1f; 2. delegate委托 2.1示意图 2.2 DelegetTest.cs 2.3 Deleget_A.cs 2.4 Deleget_B.cs 2.5 运行unity. 点击按键 A 2.6 点击按键 B 3.Event 事件 3.1单个通知 3.1.1示意图 3.1.2 Event_Test.cs 3.1.3 Event_A.cs 3…

【ONE·C++ || C++11(一)】

总言 主要介绍C11中的一些功能语法。 文章目录 总言0、思维导图1、基本情况简介2、统一的列表初始化2.1、{}的使用2.2、initializer_list2.2.1、基础介绍2.2.2、在各容器中实现说明 3、声明3.1、auto3.2、nullptr3.3、decltype 4、范围for5、智能指针6、STL中一些变化6.1、C11…

Web基础 ( 十 ) DOM

4.6.DOM 4.6.1.node结点 我们可以通过 Node 对象进行对 DOM 中节点的操作和管理。Node 对象是 DOM 中所有节点的基类&#xff0c;可以继承给 Element、Comment、Text 等具体节点类。 常用的 Node 对象属性和方法包括&#xff1a; 4.6.1.1.属性&#xff1a; nodeType&#…

【数学建模】

学习数学建模: 从基础到实践 引言 在我们日常生活中&#xff0c;数学建模&#xff08;Mathematical Modeling&#xff09;是一个非常重要的工具&#xff0c;它帮助我们理解复杂的问题&#xff0c;并找到解决这些问题的方法。在这篇博客中&#xff0c;我们将探讨数学建模的基本…

App 应用测试方法以及测试思路

分析三种主流的移动 App 类型&#xff0c;并给出和普通web测试不同的地方&#xff0c;给出测试的思路&#xff0c;并给出部分场景组合。 移动端测试还是 PC 端测试&#xff0c;业务测试其实都属于 GUI 测试的范畴&#xff0c;所以基本的测试思路&#xff0c;比如基于页面对象封…

03SpringCloud Docker

Docker (1&#xff09;从VM与Docker框架中&#xff0c;直观上VM多了一层Guest OS&#xff0c;同时Hypervisor会对硬件资源进行虚拟化&#xff0c;docker直接使用硬件资源&#xff0c;所以资源利用率相对docker低。 &#xff08;2&#xff09;openstack能够以10台/min的速度创建…

Keil_C51之Memory_mode解析

有时我们会遇到这样的报错&#xff1a; *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: _DATA_GROUP_ LENGTH: 002CH Program Size: data117.0 xdata0 code6242 Target not created. Build Time Elapsed: 00:00:00 报错截图如下&#xff1a; 这类报…