文章字数:751,阅读全文大约需要3分钟
一、基本概念
1.CPU
核心数和线程数关系
- 一般为1:1关系
- 英特尔超线程技术可以实现1个核心数2线程
CPU
时间片轮转机制
- RR调度,上线文切换(操作系统处理,程序无关)
进程和线程
进程:程序资源分配的最小单位,进程下有多个线程。
线程:cpu调度的最小单位,需要依附于进程。需要使用进程的资源并行和并发
并发:与时间相关,一定时间内可处理的能力
并行:程序设计的结构,同一时刻可以处理能力(瞬时)高并发编程意义
- 无关操作可以不用等待
- 模块化,异步化
- 可能造成冲突,死锁,资源分配不足等问题。
二、java线程
2.1天然多线程,无需手动开启既有一些线程
1 | // 虚拟机线程管理接口 |
1 | Attach Listener |
2.2 线程创建
Thread
类(自带的)Runnable
接口(自带的)Callable
有返回值的Runnable
,需要用FutureTask
包装才能实现一个完整的Runnable
并被Thread
运行。并且提供了接受返回值的方法(没有结果会阻塞)
2.3 线程退出
- 自然执行完
- 一场
stop()
resume()
等方法(不推荐使用,无法释放线程资源已废弃)
2.4线程中断(协作式)
myThread.interrupt()
中断线程(不是强制型,知识中断通知)设置线程中断标志Thread.currentThread().isInterrupted()
判断是否处于中断状态,读取中断标志位。(需要线程内部自己读取状态,实现中断)Thread.interrupted()
中断标志设置为false
- 线程抛出
InterruptedException
时会复位线程中断位sleep
、join
等阻塞的方法都会抛出。需要在catch
里重新设置中断标志位,再次中断 - 线程中阻塞时设置了
interrupt()
则会抛出InterruptedException
异常。即强制通知线程状态的改变。
2.5线程状态
- 新建,还没有
start()
- 就绪,
start()
之后,等待操作系统分配运行资源(join
方法可以获取执行权)。yield()
方法可以让线程进入就绪状态,让出当前的运行资源,重写加入等待队列 - 阻塞,
wait()
方法进入阻塞,notify()
和notifyAll()
接触阻塞。sleep()
休眠固定时间 - 死亡,
stop()
,setDeamon()
,运行结束
2.6线程优先级
Thread.setPriority
,1-10的值,不可靠。操作系统不一定会按照此值执行。
2.7守护线程
- 和主线程共同退出
- 设置
setDeamon(true)
- 守护线程中
try...finally
不一定生效finally
中不一定会执行,因为守护线程可能回合父级线程一起结束了。