Java之sleep()方法与yield()方法的区别
来源:互联网 发布:算法技术面试常问问题 编辑:程序博客网 时间:2024/06/06 02:02
1.线程睡眠:sleep()方法
sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行(不理会其他线程的优先级),并进入阻塞状态,但它并不释放对象锁。当当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于sleep()状态的线程也不会执行,因此sleep()方法常用来暂停程序的执行。查阅API文档,可以看到sleep()方法有两种重载形式:
下面程序通过调用sleep()方法来暂停主线程的执行,因为该程序只有一个主线程,当主线程进入睡眠后,系统没有可执行的线程,所以可以看到程序在sleep()处暂停。
import java.util.Date;public class sleepDemo { public static void main(String[] args) { for(int i=0;i<10;i++) { System.out.println("当前时间:"+new Date()); try { Thread.sleep(1000);//让线程暂停1秒 } catch (InterruptedException e) { e.printStackTrace(); } } }}
运行程序可以看到输出每两条字符串之间的时间间隔为1秒。
2.线程让步:yield()方法
该方法与sleep()类似,那为什么又说是让步呢?即是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行。API文档解释的作用是暂停当前正在执行的线程对象,并执行其他线程。只是不能由用户指定暂停多长时间,但它不会阻塞该线程,它只是将线程转入就绪状态,并且yield()方法只能让同优先级的线程有执行的机会。yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,但实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
代码演示:
package jiangyiThread;public class YieldTest extends Thread{ public YieldTest(String name) { super(name); } public void run() { for(int i =0;i<50;i++) { System.out.println(getName()+" "+i); if(i==20) //当i=20时,使用yield()方法让当前线程让步 { Thread.yield(); } } } public static void main(String[] args) { // TODO Auto-generated method stub //启动两个并发线程 YieldTest yt1 = new YieldTest("高级"); //把yt1线程设置成最高优先级 //yt1.setPriority(MAX_PRIORITY); yt1.start(); YieldTest yt2 = new YieldTest("低级"); //把yt2线程设置成最低优先级 //yt2.setPriority(MIN_PRIORITY); yt2.start(); }}
运行程序:
(此时高级低级只是两个线程的名字,它们优先级完全一样),我们可以看到“高级”和“低级”线程调用yield()之后将执行机会让给优先级相同的其他线程。
把设置优先级的两行代码注释给弄掉,运行程序,结果如图:
可以看出高优先级的线程调用yield()方法暂停后,系统没有与之优先级相同或更高优先级的线程,所以该线程继续执行。
最后来个简单的小结sleep()方法与yield()方法的作用:
sleep()方法 使当前线程的执行挂起一段指定的时间,把cpu时间让给其他线程。时间可以由豪秒数或纳秒数决定。
yield()方法 当前线程如果完成了所需的工作,可以暗示调度机制让别的线程使用CPU了(这个暗示不一定保证被采用)
0 0
- Java之sleep()方法与yield()方法的区别
- sleep()方法和yield()方法的区别
- 线程中的yield与sleep方法的区别
- Java 多线程学习 sleep()和yield()方法的区别
- sleep和yield方法的区别
- sleep() 和 yield()方法的区别
- sleep()和yield()方法的区别
- sleep(),wait(),yield(),join()方法的区别
- JAVA多线程之——wait/yield/sleep/join方法的区别
- Java多线程之sleep 和yield方法
- Java多线程系列-- 之 yield与join方法的区别
- Java 线程的sleep和yield方法
- 线程的sleep()方法和yield()方法的区别
- 多线程 -- yield()方法和sleep()方法的区别
- 线程的sleep()方法和yield()方法有什么区别?
- 线程的sleep()方法和yield()方法有什么区别?
- JAVA -- 线程sleep()和yield()、join()方法区别
- java中sleep方法和yield方法的比较
- 小白日记2:kali渗透测试之被动信息收集(一)
- Class对象
- 流 stream知识点总结
- 计算单源最短路径的Dijkstra算法
- Django初体验
- Java之sleep()方法与yield()方法的区别
- inputStream&&OutputStream
- 介绍ScaleType五种用法
- 赏罚有序
- Gray Code
- 获取父类的类名
- Android Studio 和 Unity3D 交互
- 第二周项目2--程序的多文件组织
- Android小项目之音乐播放器简易版