yeild
yeild是个native静态方法,这个方法是想把自己占有的cpu时间释放掉,然后和其他线程一起竞争(注意yeild的线程还是有可能争夺到cpu,注意与sleep区别)
在javadoc中也说明了,yeild是个基本不会用到的方法,一般在debug和test中使用。
join
join的意思是等待其他线程结束,如下,join方法添加之后,主线程会等待at线程结束之后再结束。
没有结束的话主线程就一直阻塞在那里
public class Test{
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);
}
}
测试结果:如果放开at.join(),输出的i很小,如果加上,则一定会输出10000000
join的本质
while(isAlive()) {
wait(0);
}
join()方法也可以传递一个时间,意为有限期地等待,超过了这个时间就自动唤醒。
这样就有一个问题,谁来notify这个线程呢,在thread类中没有地方调用了notify?
在javadoc中,找到了相关解释。当一个线程运行完成终止后,将会调用notifyAll方法去唤醒等待在当前线程实例上的所有线程,这个操作是jvm自己完成的。
所以javadoc中还给了我们一个建议,不要使用wait和notify/notifyall在线程实例上。因为jvm会自己调用,有可能与你调用期望的结果不同。