【多线程】操作系统深入学习

165 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

线程的状态有几种

Java中的线程的生命周期大体可分为6种状态。

1.NEW-新建(新创建的线程对象就是NEW,不是可运行状态 不会让cpu处理)

2.RUNNABLE-可运行(新创建的线程对象start后才会变成可运行状态,cpu处理)

​ 4.BLOCKED-阻塞(当线程争抢锁失败后变为阻塞状态,获取锁成功后又从阻塞状态变为可运行运行状态)

​ 5.WAITING-等待(如果争抢锁成功 但是当前线程不满足某些条件 调用wait方法 暂时释放锁 当前线程进入wait状态,在条件满足时 由其他线程调用notify方法 唤醒等待线程 然后再去争抢锁 如果成功则进入可运行状态,如果不成功进入阻塞状态)

​ 6.TIMED_WAITING-等待(有时限)(设置一个时间,如果等待的时间到了会自己唤醒 或者 在时间之内被notify唤醒),补充这种等待可以通过sleep(time)进行转换 不需要和锁有关系,就是sleep后进入TIMED_WAITING状态 时间到了恢复,TERMINATED-终结(线程走到尽头,释放线程)

(一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

线程和等待的关系

假如新建有多个线程并start后 进入可运行状态 但是有一个部分需要线程同步,此时多个线程争抢一把锁,假如线程1争抢成功,那么其它线程进入阻塞状态,线程1如果不满足某些条件则进入等待状态 释放锁,现在其它线程开始争抢锁,如果线程2争抢成功 那么除线程1线程2之外其它的线程陷入阻塞状态 线程2完成了线程1的某些条件 线程2完成自己的任务释放锁,现在除线程1之外的所有线程再来争抢这把锁,现在线程3争抢成功 并且完成了线程1所需要的所有条件 现在唤醒线程1 线程3完成自己的任务释放锁,现在因为线程1被唤醒时线程3还没有释放锁 所以 线程1由等待状态变成了阻塞状态 然后线程3释放锁,所以现在 所有的线程(包括线程1)开始争抢锁。