美文网首页
java多线程关系

java多线程关系

作者: 路人爱早茶 | 来源:发表于2018-04-17 17:41 被阅读0次
    image.png

    注:一个对象可有多个线程

    • 就绪状态会有不同对象的线程
    • 一般就绪状态是线程持有锁的(推理),若回到就绪状态线程发现目标资源是同步状态则会进入该资源的锁标记池排队等候锁
      1、sleep()方法会给其他线程运行的机会,而不考虑其他线程的优先级,因此会给较低线程一个运行的机会;yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。
      2、当线程执行了sleep(long millis)方法后,将转到阻塞状态,参数millis指定睡眠时间;当线程执行了yield()方法后,将转到就绪状态。
      3、sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出任何异常
      4、sleep()方法比yield()方法具有更好的移植性
      5、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待os分配时间片;
      6、当线程调用了yeild()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;
      7、当线程刚进入可运行状态(即就绪状态),发现将要调用的资源被synchronized(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,即先到先得)一旦线程获得锁标记后,就转入可运行状态,等待os分配CPU时间片;
      8、当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的锁。它被一个notify()方法唤醒时,等待池中的线程就被放到锁池中。该线程从锁池中获得锁,然后回到wait()前的中断现场。
      9当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(wait(1000)时可以自动唤醒)(由于notify()只是唤醒一个线程。但我们由于不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够唤醒,)因此在实际使用时,一般都用notifyAll(),方法唤醒所有线程(),当线程被唤醒后会进入锁池,等待获得锁标记

    相关文章

      网友评论

          本文标题:java多线程关系

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