Thread.yield 方法会使当前线程放弃CPU时间片,把执行机会让给相同或更高优先级的线程(yield英文意思就是屈服,放弃的意思嘛,可以理解为当前线程暂时屈服于别人了)。
注意,此时当前线程不会阻塞,只是进入了就绪状态,随时可以再次获得CPU时间片,从而进入运行状态。也就是说,其实yield方法,并不能保证,其它相同或更高优先级的线程一定会获得执行权,也有可能,再次被当前线程拿到执行权。
yield方法和sleep方法一样,也是不释放锁资源的。可以通过代码来验证这一点:
public class TestYield { public static void main(String[] args) { YieldThread yieldThread = new YieldThread(); for (int i = 0; i < 10; i++) { Thread t = new Thread(yieldThread); t.start(); } } } class YieldThread implements Runnable { private int count = 0; @Override public synchronized void run() { for (int i = 0; i < 10; i++) { count ++; if(count == 1){ Thread.yield(); System.out.println("线程:"+Thread.currentThread().getName() + "让步"); } System.out.println("线程:"+Thread.currentThread().getName() + ",count:"+count); } } }结果:
会看到,线程让步之后,并不会释放锁。因此,其它线程也没机会获得锁,只能把当前线程执行完之后,才会释放。(对于这一点,其实我是有疑问的。既然yield不释放锁,那为什么还要放弃执行权呢。就算放弃了执行权,别的线程也无法获得锁啊。)
所以,我的理解,yield一般用于不存在锁竞争的多线程环境中。如果当前线程执行的任务时间可能比较长,就可以选择用yield方法,暂时让出CPU执行权。让其它线程也有机会执行任务,而不至于让CPU资源一直消耗在当前线程。
5)suspend、resume
suspend 会使线程挂起,并且不会自动恢复,只有调用 resume 方法才能使线程进入就绪状态。注意,这两个方法由于有可能导致死锁,已经被废弃。