Java 之 线程睡眠和线程让步

时间:2022-10-05 17:30:39

线程睡眠

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

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

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


        当当前线程调用sleep方法进入阻塞状态后,在其睡眠时间段内,改线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于sleep中的线程也不会执行,因此sleep方法常用来暂停程序的执行。


线程让步

        yield方法是一个和sleep方法有点相似的方法,它也是Thread类提供的一个静态方法,它可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入就绪状态。yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield方法暂停之后,线程调度器又将其调度出来重新执行。

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

package com.hehe.thread;

public class Yield extends Thread{

public Yield(String name){
super(name);
}

//定义run方法作为线程执行体
public void run(){
for (int i = 0; i <50; i++) {
System.out.println(getName() + " " + i);

if (i==20) {
Thread.yield();
}
}
}

public static void main(String[] args)throws Exception{
//启动两个并发线程
Yield yieldThread1=new Yield("高级");
yieldThread1.setPriority(Thread.MAX_PRIORITY);
yieldThread1.start();

Yield yieldThread2=new Yield("低级");
yieldThread2.setPriority(Thread.MIN_PRIORITY);
yieldThread2.start();
}
}

Java 之 线程睡眠和线程让步


sleep和yield的区别:

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

        2.sleep方法会将线程转入阻塞状态,知道经过阻塞时间才会转入就绪状态,而yield不会将线程转入阻塞状态,它只是强制当前线程进入就绪状态。因此完全有可能某个线程调用yield方法暂停之后,立即再次获得处理器资源被执行。

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