进程&线程:
进程:
一个进程就对应一个应用程序
线程:
进程执行代码的单元
如果运行java程序会启动JVM(进程),该进程会创建并启动多个线程去执行
并发&并行
并发:
一个CPU去执行一个或者多个线程,同一时刻,只有一个线程去执行,但是执行一会就会让出CPU给其他线程执行。
但是交替地速度非常快,给人的感觉同时执行
让出CPU以后又抢到了CPU线程不是从头开始执行,而是从什么地方停止就从什么地方开始,直到所有的线程执行结束。
并行:
多个线程占用不同的CPU同时执行。
用户去设计线程只考虑单核CPU,只考虑并发。
时间片:
线程占用CPU的一段时间称为时间片
CPU分给线程去执行代码的一段时间
时间较短 都是毫秒级别
调度:(抢占式)
如果每个线程的优先级高,CPU就会随机挑选一个线程先去执行一会
如果优先级越高,有很大几率得到CPU的时间片,有很大可能性先执行完
main线程:
JVM创建该线程并且启动了
用来执行main方法
自定义线程
第一种方式
子类继承Thread类
重写run方法
创建线程对象并且调用start方法启动
第二种方式
直接创建Thread对象
在其构造方法传入Runnable接口实现对象
start方法启动
如果在main线程里面创建并启动了线程,main有可能接着往下执行,也有可能创建的线程执行一会,main线程的结束意味着main方法执行结束。但是JVM进程并没有关闭,当所有的进程执行完毕后,JVM才会关闭。
如果后台线程正在运行,JVM关闭,里面所有的线程都关闭
线程分类:
前台线程(用户线程):
main线程和用户自定义线程
都是用来执行用户撰写的代码
任意一个浅谈线程没有结束JVM就不会关闭,所有的前台线程结束JVM才会关闭。
后台线程(守护线程):
主要为前台线程运行提供环境
后台线程正在执行,但是JVM进程恰好关闭了,后台线程也会关闭
通过线程对象.setDemaon(true)强制的将前台线程转为后台线程
其他非重要特征:
可以再创建线程或者是线程启动之前赋予一个自定义名字
也可以在创建线程或者线程启动之前设置线程的优先级