ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JAVA面向对象学习——java多线程———控制线程——线程睡眠:sleep()方法

2022-03-27 19:32:13  阅读:155  来源: 互联网

标签:JAVA yield 59 线程 当前 sleep 多线程 方法


 

 

 

 

 

===========================================

 

 

线程睡眠:sleep

 

 

 

如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep方法,sleep方法有两种重载的形式:

 

 

 

——static void sleep(long millis):让当前正在执行的线程暂停millis毫秒,并进入阻塞状态,该方法受到系统计时器和线程调度器的精度和准确度的影响。

 

 

——static void sleep(long millis, int nanos):让当前正在执行的线程暂停millis毫秒加nanos毫微妙,并进入阻塞状态,该方法受到系统计时器和线程调度器的精度和准确度的影响。

 

 

 

==============================================================

 

 

 

线程让步

 

 

yield()方法是一个和sleep方法有点相似的方法,它也是一个Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程。

yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield方法暂停之后,线程调度器又将其调度出来重新执行。

 

 

 

实际上,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的、就绪状态的线程才会获得执行的机会。

 

 

 

 

=================================================

 

 

 

sleep方法和yield方法的区别

 

 

 

sleep方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级。

但yield方法只会给优先级相同,或优先级更高的线程执行机会。

 

 

 

 

sleep方法会将线程转入阻塞状态,直到经过阻塞时间才会转入就绪状态。

而yield不会将线程转入阻塞状态,它只是强制当前线程进入就绪状态。

因此完全有可能某个线程调用yield方法暂停之后,立即再次获得处理器资源被执行。

 

 

 

 

sleep方法声明抛出了InterruptedException异常,所以调用sleep方法时要么捕捉该异常,要么显式声明抛出该异常。

而yield方法则没有声明抛出任何异常。

 

 

 

 

sleep方法比yield方法有更好的可移植性,通常不要依靠yield来控制并发线程的执行。

 

====================================================

 

如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep()方法来实现。

 

关于sleep()方法和yield()方法的区别如下。

 

➢ sleep()方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级;但yield()方法只会给优先级相同,或优先级更高的线程执行机会。

 

➢ sleep()方法会将线程转入阻塞状态,直到经过阻塞时间才会转入就绪状态;而yield()不会将线程转入阻塞状态,它只是强制当前线程进入就绪状态。

       因此完全有可能某个线程被yield()方法暂停之后,立即再次获得处理器资源被执行。

 

➢ sleep()方法声明抛出了InterruptedException异常,所以调用sleep()方法时要么捕捉该异常,要么显式声明抛出该异常;而yield()方法则没有声明抛出任何异常。

 

➢ sleep()方法比yield()方法有更好的可移植性,通常不建议使用yield()方法来控制并发线程的执行。

 

 

 ==================================================================

 

 

 

 

public class SleepTest
{
	public static void main(String[] args)
		throws Exception
	{
		for (var i = 0; i < 10; i++)
		{
			System.out.println("当前时间: " + new Date());
			// 调用sleep方法让当前线程暂停1s。
			Thread.sleep(1000);
		}
	}
}

  

 

 

 

 

 

public class SleepTest
{
	public static void main(String[] args)
		throws Exception
	{
		for (var i = 0; i < 10; i++)
		{
			System.out.println("当前时间: " + new Date());
			// 调用sleep方法让当前线程暂停1s。
			Thread.sleep(1000);
		}
	}
}

  

 

 

 

 

 

下午 06:59:15: Executing task 'SleepTest.main()'...

> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes

> Task :SleepTest.main()

 

 

当前时间: Sun Mar 27 18:59:16 CST 2022
当前时间: Sun Mar 27 18:59:19 CST 2022
当前时间: Sun Mar 27 18:59:22 CST 2022
当前时间: Sun Mar 27 18:59:25 CST 2022
当前时间: Sun Mar 27 18:59:28 CST 2022
当前时间: Sun Mar 27 18:59:31 CST 2022
当前时间: Sun Mar 27 18:59:34 CST 2022
当前时间: Sun Mar 27 18:59:37 CST 2022
当前时间: Sun Mar 27 18:59:40 CST 2022
当前时间: Sun Mar 27 18:59:43 CST 2022

 

BUILD SUCCESSFUL in 31s
2 actionable tasks: 2 executed
下午 06:59:46: Task execution finished 'SleepTest.main()'.

标签:JAVA,yield,59,线程,当前,sleep,多线程,方法
来源: https://www.cnblogs.com/xiaobaibailongma/p/16063991.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有