join
一个线程的输入可能非常依赖于另外一个或者多个线程的输出。此时,这个线程就需要等待依赖线程执行完毕,才能继续执行。
JDK 提供了 join()
方法来实现这个功能。
参考实例:
public class JoinMain {
public volatile static int i = 0;
public static class AddThread extends Thread {
@Override
public void run() {
for (i = 0; i < 10000000; i++) ;
}
}
public static void main(String[] args) throws InterruptedException {
AddThread at = new AddThread();
at.start();
at.join();
System.out.println(i);
}
}
主函数中,如果不使用 join()
等待 AddThread,那么得到的 i 很可能是 0 或者是一个非常小的数字。
yield
这是一个静态方法,一旦执行,它会使当前线程让出 CPU。
如果你觉得一个线程不那么重要,或者优先级非常低,而且又害怕它会占用太多的 CPU 资源,那么可以在适当的时候调用 Thread.yield()
,给与其他重要线程更多的工作机会。
注意
让出 CPU 并不代表当前线程不执行了。当前线程让出 CPU 调度时间后,会重新争夺 CPU 调度时间,但是是否能够再次被分配到,就不一定了。