什么是进程,什么是线程?

首先请大家思考一个问题:什么是进程,什么是线程?

进程是操作系统分配资源的最小单位(通俗的讲就是你的计算机上运行的软件,例如:QQ,微信)

线程是操作系统能够进行运算调度的最小单位(QQ或者微信软件可以同时接收多个人发来的消息,或者可以同时做多个事情)

一个进程可以由若干个线程组成。

线程都有哪些状态?

从操作系统的角度来看:

常见的操作系统的线程一般称为“五态模型”,顾名思义操作系统的线程一般有5种状态,分别是:NEW,READY,RUNNING,WAITING,TERMINATED。

NEW 线程刚刚被创建

READY 等待获取CPU时间片

RUNNING 获取到CPU资源,正在执行的状态

WAITING 线程进入IO等待

TERMINATED 线程执行完毕或者异常退出

操作系统层面的线程状态转换一般是这样进行的,如下图所示:

image.png

从java语言的角度来看:

java线程状态的实现对操作系统的线程状态做了一部分的细分和一部分合并

在Thread 类型中有个State枚举类,它定义了几种线程状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。

NEW 线程刚刚被创建,与操作系统NEW状态对应

RUNNABLE 可运行状态,对应操作系统READY,RUNNING状态

WAITING 等待状态,没有超时时间,是对操作系统WAITING细分之一

TIMED_WAITING 等待状态,有超时时间,是对操作系统WAITING细分之一

BLOCKED 阻塞状态,是对操作系统WAITING细分之一

TERMINATED 终止状态,对应操作系统的TERMINATED

java线程的状态转换过程,您可以参考下图,Thread 类中的枚举类型State也有详细的转换描述。

image.png

java中如何创建线程?

常见的创建线程的方法:

  1. 继承Thread类,无返回值
  2. 实现Runnable接口/lambda表达式,无返回值
  3. 线程池ThreadPoolExecutor.execute(Runnable),无返回值
  4. 线程池ThreadPoolExecutor.submit(Callable),有返回值
  5. FutureTask(Callable),然后使用Thread或者ThreadPoolExecutor执行,有返回值