线程让步(yield)和线程睡眠(sleep)区别

线程睡眠(sleep)

让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep()方法来实现。当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间内,该线程不会获得执行的机会,而其它任何优先级的线程都可以得到执行的机会,即使系统中没有其它可执行的线程,处于sleep()的线程也不会执行,sleep()是用来暂停线程的执行。

线程让步(yield)

yield()方法是一个和sleep()方法有点相似的方法,它也是Thread类提供的一个静态方法。可以让当前正在执行的线程暂停,但它不会阻塞该线程,只是将该线程转入就绪状态。yeild()只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield()线程暂停之后,线程调度器又将其调度出来重新执行。
当某个线程调用了yield()方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的处于就绪状态的线程才会获得执行机会

  • sleep()方法的声明抛出了InterruptedException异常,所以调用sleep()方法时要么捕捉异常,要么抛出该异常。
  • sleep()方法比yield()方法具有更好的可移动性,所以建议不要使用yield()方法来控制并发线程的执行

class Yield implements Runnable{
    int i=0;
    @Override
    public void run(){
        for(;i<50;i++){
            System.out.println(Thread.currentThread().getName()+"->"+i);
            //当i等于20时,当前线程让步,让线程调度器重新调度
            if(i==10){
                Thread.yield();
            }
        }
    }
}
public class YieldThreadTest extends Thread{
    public YieldThreadTest(Runnable runnable,String name){
        super(runnable,name);
    }
    public static void main(String[] args) {
        Yield yd=new Yield();
        
        YieldThreadTest ytt1=new YieldThreadTest(yd,"高优先级线程");
        ytt1.setPriority(Thread.MAX_PRIORITY);//设置优先级最高
        ytt1.start();
        
        YieldThreadTest ytt2=new YieldThreadTest(yd,"低优先级线程");
        ytt2.setPriority(Thread.MIN_PRIORITY);//设置优先级最低
        ytt2.start();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38261174/article/details/81364616
今日推荐