线程的基础知识

303 阅读3分钟

1.进程

1)进程内部会有多个线程,并根据任务不同来切换

2)协程是绿色的线程,也就是说不被os管理的线程

进程:操作系统进行资源分配的基本单位

image.png

2.线程:是进程执行的基本单元,多个线程之间共享相同的资源。

(1)线程是一个程序中的不同执行路径

(2)多线程是一个程序在执行中有多个执行路径

3.程序:可执行的文件

4.线程的切换

假如有T1,与T2两个线程,当T1在执行的时候,T2要执行,这时系统就把T1的数据放入缓存,然后开始执行T2,当要再切换要执行T1的时候,就把T1的线程数据从缓存中取出来,将T2的线程数据放入缓存,开始执行T1,这就是线程切换,中间是需要操作系统的调度过程,调度是消耗系统资源的。

image.png

5.单核CPU设定多线程是否有意义

单核CPU是在同一时间,只能跑一个线程,假如当一个线程在单核cpu中执行的时间,如果这个线程在等待,那么这个时候就可以把资源让给其他线程,所以单核cpu设置多线程也是有意义的

是有意义的,如果当前线程执行过程中出现等待,cpu是空闲状态的,这时候可以切换到其他线程继续执行,增强了cpu的利用率

6.工作线程数是不是越大越好?

不是,线程的上下文切换是由用户态装换为内核态,消耗CPU资源。

7.线程设置多少最合适

image.png

8.创建线程的方法

  1. new MyThread().start()
  2. new Thread(r).start()
  3. new Thread(lamda).start()
  4. ThreadPool
  5. Future Callable and FutureTask

线程状态

一、java的6种线程状态

1.new :线程刚刚创建,还没启动

2.runnable:可运行状态

3.waiting:等待被唤醒

4。timed waiting:隔一段时间自动唤醒

5.blocked:被阻塞,等待锁

6.terminated:线程结束

线程的3种打断方法interrupt

image.png

线程的结束

image.png

(1)stop方法(不建议使用)--->>>stop方法过于简单粗暴,终止线程时会释放所有锁,并且没有善后工作,容易产生数据不一致问题

(2)volatile

  • volatile修饰共享变量是为了让主线程修改running时,子线程可以立即读取到修改后的值。

  • 如果没有volatile修饰,可能会导致主线程修改完的数据没有同步到主内存,导致子线程无法读取到

  • 其次如果子线程在while循环中有sleep操作,那么sleep也会触发CPU缓存同步到主内存的操作,从而子线程就可以读取到修改后的结果了

  • 。volatile 适合线程的结束 设置一个变量 用volatile修饰 让其变成标志位 在需要结束的时候让其结束线程,但是如果做了阻塞操作就不能回去,同时打断时间不精确,即volatile同步线程标志位时间不精确

(3)interrupt和interrupted 但是也会有同步线程标志位时间不精确的问题