线程有哪些状态?
4 个回答
不必太张扬,是花自然香。ketty线程池生命周期: - RUNNING:表示线程池处于运行状态,这时候的线程池可以接受任务和处理任务。值是-1, - SHUTDOWN:表示线程池不接受新任务,但仍然可以处理队列中的任务,二进制值是0。调用showdown()方法会进入到SHUTDOWN状态。 - STOP:表示线程池不接受新任务,也不处理队列中的任务,同时中断正在执行任务的线程,值是1。调用showdownNow()方法会进入到STOP状态。 - TIDYING:表示所有的任务都已经终止,并且工作线程的数量为0。值是2。SHUTDOWN和STOP状态的线程池任务执行完了,工作线程也为0了就会进入到TIDYING状态。 - TERMINATED:表示线程池处于终止状态。值是3 发布于 2021-12-13 14:03 •IP属地 云南举报评论收藏
用眼睛是看不到事物的本质的,只有心灵才能够洞察一切。hello在操作系统中,线程等同于轻量级的进程。  所以传统的操作系统线程一般有以下状态 1. 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。 2. 就绪状态: 当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。 3. 运行状态: 如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。 4. 阻塞状态: 4. 如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种: - 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。 - 同步阻塞:线程在获取 synchronized同步锁失败(因为同步锁被其他线程占用)。 - 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。 5. 死亡状态: 一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。 但是Java中Thread对象的状态划分跟传统的操作系统线程状态有一些区别。 ```java public enum State { NEW,//新建态 RUNNABLE,//运行态 BLOCKED,//阻塞态 WAITING,//等待态 TIMED_WAITING,//有时间限制的等待态 TERMINATED;//死亡态 } ```  #### NEW 新建态 处于NEW状态的线程此时尚未启动,还没调用Thread实例的start()方法。 #### RUNNABLE 运行态 表示当前线程正在运行中。处于RUNNABLE状态的线程可能在Java虚拟机中运行,也有可能在等待其他系统资源(比如I/O)。 Java线程的RUNNABLE状态其实是包括了传统操作系统线程的ready和running两个状态的。 #### BLOCKED 阻塞态 阻塞状态。线程没有申请到synchronize同步锁,就会处于阻塞状态,等待锁的释放以进入同步区。 #### WAITING 等待态 等待状态。处于等待状态的线程变成RUNNABLE状态需要其他线程唤醒。 调用如下3个方法会使线程进入等待状态: - Object.wait():使当前线程处于等待状态直到另一个线程调用notify唤醒它; - Thread.join():等待线程执行完毕,底层调用的是Object实例的wait()方法; - LockSupport.park():除非获得调用许可,否则禁用当前线程进行线程调度。 - TIMED_WAITING 超时等待状态 超时等待状态。线程等待一个具体的时间,时间到后会被自动唤醒。 调用如下方法会使线程进入超时等待状态: - Thread.sleep(long millis):使当前线程睡眠指定时间; - Object.wait(long timeout):线程休眠指定时间,等待期间可以通过notify()/notifyAll()唤醒; - Thread.join(long millis):等待当前线程最多执行millis毫秒,如果millis为0,则会一直执行; - LockSupport.parkNanos(long nanos): 除非获得调用许可,否则禁用当前线程进行线程调度指定时间; - LockSupport.parkUntil(long deadline):同上,也是禁止线程进行调度指定时间; #### TERMINATED 终止态 终止状态。此时线程已执行完毕。 #### 状态转换 1.BLOCKED与RUNNABLE状态的转换 处于BLOCKED状态的线程是因为在等待锁的释放,当获得锁之后就转换为RUNNABLE状态。 2.WAITING状态与RUNNABLE状态的转换 Object.wait(),Thread.join()和LockSupport.park()这3个方法可以使线程从RUNNABLE状态转为WAITING状态。 3.TIMED_WAITING与RUNNABLE状态转换 TIMED_WAITING与WAITING状态类似,只是TIMED_WAITING状态等待的时间是指定的。 调用Thread.sleep(long),Object.wait(long),Thread.join(long)会使得RUNNABLE状态转换为TIMED_WAITING状态发布于 2021-10-21 15:02 •IP属地 甘肃举报评论收藏
见过花就好,何必在意花属于谁。java小生线程池有5种状态:Running、ShutDown、Stop、Tidying、Terminated。 线程池各个状态切换框架图: 发布于 2021-07-01 19:54 •IP属地 安徽举报评论收藏
有些东西不需要答案,态度就是答案。路飞线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。 1. 创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。 2. 3. 就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。 4. 5. 运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。 6. 7. 阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。 8. 9. 死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪发布于 2021-07-01 19:46 •IP属地 广西举报评论收藏
公众号进入网站体验更佳

