join和yield 等待线程结束(join)和谦让(yield)

        在很多情况下,线程之间的协作和人与人之间的协作非常类似。一种非常常见的合作方式,就是分工合作,以我们非常熟悉的软件开发为例,在一个项目进行时,总是应该有几位号称是“需求分析师”的同事,先对系统的需求和功能点进行整理和总结,然后,以书面形式给出-份需求说明或者类似的参考文档,然后,软件设计师、研发工程师才会一拥而上,进行软件开发。如果缺少需求分析师的工作输出,那么软件研发的难度可能会比较大。因此,作为一名软,件研发人员,总是喜欢等待需求分析师完成他应该完成的任务后,才愿意投身工作。简单地说,就是研发人员需要等待需求分析师完成他的工作,然后,才能进行研发。

        将这个关系对应到多线程应用中,很多时候,一个线程的输入可能非常依赖于另外一个或者多个线程的输出,此时,这个线程就需要等待依赖线程执行完毕,才能继续执行。JDK提供了join()操作来实现这个功能,如下所示,显示了2个join()方法;

    public final void join() throws InterruptedException
    
    public final synchronized void join(long millis) throws InterruptedException  

第一个join()方法表示无限等待,它会一直阻塞当前线程,直到目标线程执行完毕。第二个方法给出了一个最大等待时间,如果超过给定时间目标线程还在执行,当前线程也会因为“等不及了",而继续往下执行。

英文join的翻译,通常是加入的意思,在这里感觉也非常贴切,因为一个线程要加入另外一个线程,那么最好的方法就是等着它一起走.

这里提供一个简单点的join()实例,供大家参考:

public class JoinMain {

    public volatile static int i = 0;
    publie

    static class AddThread extends Thread {

        @override
        public void run( 
	for(i=0;i<10000000;i++);
    }

    public static void main(String(]args) throws InterruptedException {
        Addrhread at -new AddThread();
        at.start();
        at.join();
        System.out.printin(i):
    }

}

        主函数中,如果不使用join()等待AddThread,那么得到的i很可能是0或者一个非常小的数字。因为AddThread还没开始执行, i的值就已经被输出了。但在使用ioin()方法后,表示主线程愿意等待AddThread执行完毕,跟着AddThread一起往前走,故在join()返回时, AddThread已经执行完成,故i总是10000000.

        有关ioin(),我还想再补充一点, ioin()的本质是让调用线程wait)在当前线程对象实例上。下面是JDK中ioin()实现的核心代码片段:

while(isAlive()){
    wait(0);
}

 

        可以看到,它让调用线程在当前线程对象上进行等待。当线程执行完成后,被等待的线程会在退出前调用notifvAll0通知所有的等待线程继续执行。因此,值得注意的一点是:不要在应用程序中,在Thread对象实例上使用类似wait)或者notifv0等方法,因为这很有可能会影响至统API的工作,或者被系统API所影响。

        另外一个比较有趣的方法,是Thread.yield0),它的定义如下:

public static native void yield();

这是一个静态方法,一旦执行,它会使当前线程让出CPU,但要注意,让出CPU并不表示当前线程不执行了。当前线程在让出CPU后,还会进行CPU资源的争夺,但是是否能够国次被分配到,就不一定了。因此,对Thread.yieldo的调用就好像是在说:我已经完成一些最面要的工作了,我应该是可以休息一下了,可以给其他线程一些工作机会啦!

如果你觉得一个线程不那么重要,或者优先级非常低,而且又害怕它会占用太多的CPU源,那么可以在适当的时候调用Thread.yield(),给予其他重要线程更多的工作机会。

摘自:《实战Java高并发程序设计》葛一鸣 郭超 著

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值