join

一个线程的输入可能非常依赖于另外一个或者多个线程的输出。此时,这个线程就需要等待依赖线程执行完毕,才能继续执行。
JDK 提供了 join() 方法来实现这个功能。

参考实例:
  1. public class JoinMain {
  2. public volatile static int i = 0;
  3. public static class AddThread extends Thread {
  4. @Override
  5. public void run() {
  6. for (i = 0; i < 10000000; i++) ;
  7. }
  8. }
  9. public static void main(String[] args) throws InterruptedException {
  10. AddThread at = new AddThread();
  11. at.start();
  12. at.join();
  13. System.out.println(i);
  14. }
  15. }

主函数中,如果不使用 join() 等待 AddThread,那么得到的 i 很可能是 0 或者是一个非常小的数字。

yield

这是一个静态方法,一旦执行,它会使当前线程让出 CPU。
如果你觉得一个线程不那么重要,或者优先级非常低,而且又害怕它会占用太多的 CPU 资源,那么可以在适当的时候调用 Thread.yield() ,给与其他重要线程更多的工作机会。

注意

让出 CPU 并不代表当前线程不执行了。当前线程让出 CPU 调度时间后,会重新争夺 CPU 调度时间,但是是否能够再次被分配到,就不一定了。