1.进程
1)进程内部会有多个线程,并根据任务不同来切换
2)协程是绿色的线程,也就是说不被os管理的线程
进程:操作系统进行资源分配的基本单位
2.线程:是进程执行的基本单元,多个线程之间共享相同的资源。
(1)线程是一个程序中的不同执行路径
(2)多线程是一个程序在执行中有多个执行路径
3.程序:可执行的文件
4.线程的切换
假如有T1,与T2两个线程,当T1在执行的时候,T2要执行,这时系统就把T1的数据放入缓存,然后开始执行T2,当要再切换要执行T1的时候,就把T1的线程数据从缓存中取出来,将T2的线程数据放入缓存,开始执行T1,这就是线程切换,中间是需要操作系统的调度过程,调度是消耗系统资源的。
5.单核CPU设定多线程是否有意义
单核CPU是在同一时间,只能跑一个线程,假如当一个线程在单核cpu中执行的时间,如果这个线程在等待,那么这个时候就可以把资源让给其他线程,所以单核cpu设置多线程也是有意义的
是有意义的,如果当前线程执行过程中出现等待,cpu是空闲状态的,这时候可以切换到其他线程继续执行,增强了cpu的利用率
6.工作线程数是不是越大越好?
不是,线程的上下文切换是由用户态装换为内核态,消耗CPU资源。
7.线程设置多少最合适
8.创建线程的方法
- new MyThread().start()
- new Thread(r).start()
- new Thread(lamda).start()
- ThreadPool
- Future Callable and FutureTask
线程状态
一、java的6种线程状态
1.new :线程刚刚创建,还没启动
2.runnable:可运行状态
3.waiting:等待被唤醒
4。timed waiting:隔一段时间自动唤醒
5.blocked:被阻塞,等待锁
6.terminated:线程结束
线程的3种打断方法interrupt
线程的结束
(1)stop方法(不建议使用)--->>>stop方法过于简单粗暴,终止线程时会释放所有锁,并且没有善后工作,容易产生数据不一致问题
(2)volatile
-
volatile修饰共享变量是为了让主线程修改running时,子线程可以立即读取到修改后的值。
-
如果没有volatile修饰,可能会导致主线程修改完的数据没有同步到主内存,导致子线程无法读取到
-
其次如果子线程在while循环中有sleep操作,那么sleep也会触发CPU缓存同步到主内存的操作,从而子线程就可以读取到修改后的结果了
- 。volatile 适合线程的结束 设置一个变量 用volatile修饰 让其变成标志位 在需要结束的时候让其结束线程,但是如果做了阻塞操作就不能回去,同时打断时间不精确,即volatile同步线程标志位时间不精确