java中sleep执行完之后,线程进入什么状态,就绪还是准备状态,另外问一下yield()执行完呢?还有join呢?

解决方案 »

  1.   

    sleep执行完后,线程进入睡眠状态,只有当睡眠时间到达(sleep interval expires)或者被打扰(interrupted)才进入就绪状态(ready),
    线程调用yield()执行完后使相同优先级的线程都获得运行的机会。yield方法只用于非分时的系统中。
    线程调用join()方法后,等待该线程的终止。形参列表中可以设定终止需要的时间。
      

  2.   

      [线程的interrupt()方法,interrupted()和isInterrupted()]  这三个方法是关系非常密切而且又比较复杂的,虽然它们各自的功能很清楚,但它们之间的关系有大多数人不是真正的了解。  先说interrupt()方法,它是实例方法,而它也是最奇怪的方法,在java语言中,线程最初被设计为"隐晦难懂"的东西,直到现在它的语义不没有象它的名字那样准确。大多数人以为,一个线程象调用了interrupt()方法,那它对应的线程就应该被中断而抛出异常,事实中,当一个线程对象调用interrupt()方法,它对应的线程并没有被中断,只是改变了它的中断状态。  使当前线程的状态变以中断状态,如果没有其它影响,线程还会自己继续执行。  只有当线程执行到sleep,wait,join等方法时,或者自己检查中断状态而抛出异常的情况下,线程才会抛出异常。如果线程对象调用interrupt()后它对应的线程就立即中断,那么interrupted()方法就不可能执行。   因为interrupted()方法是一个static方法,就是说只能在当前线程上调用,而如果一个线程interrupt()后它已经中断了,那它又如何让自己interrupted()?  正因为一个线程调用interrupt()后只是改变了中断状态,它可以继续执行下去,在没有调用sleep,wait,join等法或自己抛出异常之前,它就可以调用interrupted()来清除中断状态(还会原状)interrupted()方法会检查当前线程的中断状态,如果为 "被中断状态"则改变当前线程为"非中断状态"并返回true,如果为"非中断状态"则返回false,它不仅检查当前线程是否为中断状态,而且在保证当前线程回来非中断状态,所以它叫"interrupted",是说中断的状态已经结束(到非中断状态了)isInterrupted()方法则仅仅检查线程对象对应的线程是否是中断状态,并不改变它的状态。  目前大家只能先记住这三个方法的功能,只有真正深入到多线程编程实践中,才会体会到它们为什么是对象方法,为什么是类方法。  线程到底什么时候才被中断抛出InterruptedException异常,我们将在提高篇中详细讨论。  [sleep(),join(),yield()方法]  在现在的环节中,我只能先说明这些方法的作用和调用原则,至于为什么,在基础篇中无法深入,只能在提高篇中详细说明。  sleep()方法中是类方法,也就是对当前线程而言的,程序员不能指定某个线程去sleep,只能是当前线程执行到sleep()方法时,睡眠指定的时间(让其它线程运行).事实上也只能是类方法,在当前线程上调用.试想如果你调用一个线程对象的sleep()方法,那么这个对象对应的线程如果不是正在运行,它如何sleep()?所以只有当前线程,因为它正在执行,你才能保证它可以调用sleep()方法。  原则:[在同步方法中尽量不要调用线程的sleep()方法],或者简单说,对于一般水平的程序员你基本不应该调用sleep()方法。  join()方法,正如第一节所言,在一个线程对象上调用join方法,是当前线程等待这个线程对象对应的线程结束,比如有两个工作,工作A要耗时10秒钟,工作B要耗时10秒或更多。我们在程序中先生成一个线程去做工作B,然后做工作A。  new?B().start();//做工作B  A();//做工作A  工作A完成后,下面要等待工作B的结果来进行处理.如果工作B还没有完成我就不能进行下面的工作C,所以  B?b?=?new?B();  b.start();//做工作B  A();//做工作A  b.join();//等工作B完成。  C();//继续工作C。  原则:[join是测试其它工作状态的唯一正确方法],我见过很多人,甚至有的是博士生,在处理一项工作时如果另一项工作没有完成,说让当前工作线程sleep(x),我问他,你这个x是如何指定的,你怎么知道是100毫秒而不是99毫秒或是101毫秒?其实这就是OnXXX事件的实质,我们不是要等多长时间才去做什么事,而是当等待的工作正好完成的时候去做。  yield()方法也是类方法,只在当前线程上调用,理由同上,它主是让当前线程放弃本次分配到的时间片原则:[不是非常必要的情况下,没有理由调用它].调用这个方法不会提高任何效率,只是降低了CPU的总周期上面介绍的线程一些方法,基于(基础篇)而言只能简单提及.以后具体应用中我会结合实例详细论述。  线程本身的其它方法请参看API文档.下一节介绍非线程的方法,但和线程密切相关的两[三]个对象方法:  [wait(),notify()/notifyAll()]  这是在多线程中非常重要的方法。
    关于这两个方法,有很多的内容需要说明.在下面的说明中可能会有很多地方不能一下子明白,但在看完本节后,即使不能完全明白,你也一定要回过头来记住下面的两句话:  [wait(),notify()/notityAll()方法是普通对象的方法(Object超类中实现),而不是线程对象的方法]  [wait(),notify()/notityAll()方法只能在同步方法中调用]
      

  3.   

    从08年开始写C#的线程
    写了5年,总共只看过2页书
    虽然说应用的不多,但也起码有好几个项目,看了2页书,就能做了上个星期,做android要用线程
    有5年的基础
    还要google了一个星期的
    才搞懂了 
    interrupt和join
    yield还没搞懂,还要再看
    项目也拖了一个星期了
    以我对java ide的了解,还要测试,难保真正应用的过程中,还出个莫名其妙的问题
    起码还要搞2个星期
    我只要做一个功能啊,代价就是5年的基础,看一个星期的书,2个星期调试测试。
    我现在知道了当时为什么微软敢说vs提高了程序员50%的效率了。这个就是java的线程
    执行了sleep之后,调用interrupt会爆错的,爆错之后会发生什么情况?在android和spring框架下可大不同哦,程序员你自找的,可不关java和框架的事哦,我X你老母,有的选我会选java么?而且必须搞清楚的是,sleep之后,该线程就不能暂时停止了,所以interrupt必须是写在另外一个线程的,可在另一个线程执行interrupt后会出现至少2种情况,至于sleep所在的线程会发生什么情况,你自己看着办吧。
    简单来说就是,有理说不清,书上或者文档那些概念,一句话就带过,想想就知道java那些api文档是忽悠你的join和interrupt用法一样,是2至n个线程交互的,
    简单来说,就是在一个线程,调用另外一个线程的join方法,然后这个线程就会停住,另一个线程执行完,就会通知这个线程,然后这个线程继续跑