美文网首页
线程状态流转

线程状态流转

作者: 李昂的数字之旅 | 来源:发表于2018-04-26 10:41 被阅读0次

    线程状态在Thread.java里的State枚举里定义了六种
    NEW:new Thread() 但尚未启动
    RUNABLE:new Thread().start()后现在会进入就绪状态,等待分配CPU即可执行
    BLOCKED:被阻塞状态,线程正在获取锁。线程A想获取对象锁a,但是对象锁a已经被其他线程B占有了,而造成当前线程A被阻塞在获取锁a的阶段,A会进入锁a的锁池中,等锁a被释放时,会在锁池中选一个线程获取锁a。
    WATING:等待状态是线程整等待通知被唤醒,进入原因三个:Object.wati()/Thread.join()/LockSupport.park()。t1.wait()需要其他线程执行t1.notify()/t1.notifyAll()才能唤醒;t2.join()需要等待t2执行完,当前线程才能唤醒。
    TIME_WAITING:限时等待,有五种方法可以进入:Thread.sleep(1000)/Object.wait(1000)/Thread.join(1000)/LockSupport.parkNanos(1000)/LockSupport.parkUntil(1000),超过等待时间会自动进入就绪状态。
    TERMINATED:线程执行结束或者报异常则结束。

    sleep与wait的区别

    sleep到时间后会自动进入就绪状态,wait需要其他线程调用notify/notifyAll才能唤醒。sleep不会释放锁,所以到时见后可以直接就绪;wait会释放锁,唤醒后需要再次拿到锁才能执行。

    sleep与yield的区别

    两者都会放弃CPU占用,sleep可以交给优先级的线程,yield可以交给优先级相同的线程。

    释放锁

    wait()/join()

    不释放锁

    sleep()/yield()

    相关文章

      网友评论

          本文标题:线程状态流转

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