自己总结

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会自己调用,有可能与你调用期望的结果不同。

你可能感兴趣的:(自己总结)