美文网首页
自己总结

自己总结

作者: perfect_jimmy | 来源:发表于2017-01-05 14:51 被阅读11次

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

    相关文章

      网友评论

          本文标题:自己总结

          本文链接:https://www.haomeiwen.com/subject/evdzvttx.html