java控制线程(三)

sleep和yield

线程睡眠:sleep

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

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

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

与前面类似的是,程序很少调用第二种形式的sleep()方法。

通常用来暂停程序的执行。

线程让步:yield

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

当某个线程调用了yield()方法暂定之后,线程调度器又将其调度出来重新执行。

sleep和yield的区别:

1、sleep()方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级,只会给优先级相同,或
优先级更高的线程执行机会。

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

3、sleep()方法声明抛出了InterruptedException异常,所以调用sleep()方法时要么捕捉该异常,要么显示的抛出该异常
而yield()方法则没有声明抛出任何异常。

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