线程与进程
对于操作系统来说,一个任务就是一个进程(Process),比如QQ。
进程是系统进行资源分配和调度的基本单位
在一个进程内部,运行的子任务就是线程(Thread),比如QQ的一个聊天窗口
线程是操作系统进行运算调度的最小单位
在同一进程中的各个线程,都可以共享该进程所拥有的资源
协程运行在线程之上,协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程
实现线程主要有3种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现
Java查看所有进程的命令
- jps 查看所有Java进程
- jconsole 图形化界面,某个进程中所有线程状态
- jstack 某个Java进程的所有线程状态
六种线程状态
-
初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
-
运行(RUNNABLE):Java线程中将就绪(READY)和运行中(RUNNING)两种状态笼统的称为“运行”。
- 就绪(READY):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度器选中并分配cpu使用权 。
- 运行中(RUNNING):就绪(READY)的线程获得了cpu 时间片,真正开始执行程序代码。
-
阻塞(BLOCKED):表示线程阻塞于锁,正在等待进入了同步代码块的锁被释放。
-
等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)后才能继续执行。
notify和interrupt方法会唤醒线程去竞争锁,如果成功进入Runable状态,否则进入Blocked状态
-
超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回执行。
wait,join,park这些方法会令线程进入Waiting状态,如果加上时间参数,就会进入Timed-Waiting状态
-
终止(TERMINATED):表示该线程已经执行完毕。