作者:叩丁狼教育王一飞,高级讲师。转载请注明出处。
本系列对线程基础做一个系统梳理,对线程知识点再回顾。
名词解释
多任务:
指用户在同一时间内运行多个应用程序,每个应用程序可以认为是一个任务.常见的操作系统Linux、windows等就是支持多任务的操作系统。
进程:
计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,通俗讲就是对操作系统中运行的应用程序及其运行环境的统称。比如window上运行QQ程序,还需占用一定内存
线程:
指应用程序中一个单一的顺序控制流程。是进程内有一个相对独立的、可调度的执行单元,可共享进程的内存资源。
多线程:
在单个应用程序(进程)中同时运行多个线程完成不同的工作
并发:
在同一个进程中,同一个时间段,多个线程争夺共享资源过程
java中线程
Java程序都运行在Java虚拟机(JVM)中,每用java命令启动一个java应用程序,也即启动一个JVM进程。在这个JVM环境中,所有程序代码的运行都是以线程来运行。举个例子:执行java Helloworld命令,操作系统会在创建一个jvm进程,并分配相应的内存资源,接着运行程序入口main方法,创建一个main线程,用于执行helloworld流程。通常,我们将这个线程称之为主线程,当主线程运行结束后,如果没有其他存活线程,JVM进程也随即退出,释放持有的资源。
线程生命周期
线程生命周期新建状态:
使用new Thread() 创建线程对象后,此时处于新建状态。在调用线程start() 方法前,一直保持该状态。
就绪状态:
当线程执行start()方法,线程马上进入就绪状态。注意此时线程并不会马上执行,而是在就绪队列中排队等待JVM线程调度器翻牌。
运行状态:
就绪状态的线程被翻牌后,也即获取 CPU 资源,便可执行 run()方法,在run方法结束前,此时线程便处于运行状态。因为run方法是可控的(根据业务逻辑编码),所以这个状态可以根据不同逻辑切换到不同状态:比如终止线程,进入死亡状态,比如,让出CPU进入就绪状态,比如挂起线程进入阻塞状态。
阻塞状态:
当线程执行了睡眠(sleep)/挂起(suspend)等方法后,释放CPU资源,线程将从运行状态进入阻塞状态。在睡眠时间已到或获得出CPU外其他资源后可以重新进入就绪状态。阻塞状态可分为三种:
等待阻塞:线程执行 wait() 方法,使线程进入到等待阻塞状态。
同步阻塞:其他线程占用着共享资源(其他线程获取同步锁),需要等。
其他阻塞:线程调用sleep() / join()方法或者发起I/O请求时,线程就会进入到阻塞状态。
死亡状态:
线程run方法正常执行或者满足某些条件终止线程执行,线程就切换到终止状态。
线程优先级
为方便操作系统确定线程的调度顺序,java给每个线程设置了优先级,优先级从低到高,分别为1(Thread.MIN_PRIORITY)~10(Thread.MAX_PRIORITY)取整数,默认情况下,线程的优先级是5(NORM_PRIORITY)。
注意:
1:并不是说优先级越高就一定优先执行,仅仅表示有更多机会执行,这是概率问题
2:应该在start方法执行前设置线程优先级
3:在A线程中开启B线程,没有额外设置优先级下,B线程优先级跟随A线程
网友评论