Java之sleep()方法与yield()方法的区别

1.线程睡眠:sleep()方法
sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行(不理会其他线程的优先级),并进入阻塞状态,但它并不释放对象锁。当当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于sleep()状态的线程也不会执行,因此sleep()方法常用来暂停程序的执行。查阅API文档,可以看到sleep()方法有两种重载形式:
Java之sleep()方法与yield()方法的区别_第1张图片
下面程序通过调用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了(这个暗示不一定保证被采用)

你可能感兴趣的:(Java笔记)