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
原创粉丝点击