线程:cpu 调度的最小单位,不能独立于进程存在的
进程:分配资源的最小单位
超线程技术:特尔研发的一种技术 物理核心数和逻辑核心数成为1:2的关系,正常情况,核心数和线程数为 1 :1
RR 调度,CPU 时间片轮转机制,
上下文切换 20000 CPU 时间周期
并行:同时运行的任务数 同时开了三个门
并发:不能脱离时间单位,单位时间内的并发量 每个门一分钟过 10 人
多线程:
充分利用 CPU 资源,加快用户的响应时间
锁
线程限制:
OS 限制:Linux 单进程最多 1000,Windows 单进程最多 2000
新线程启动都会分配栈空间,Java 默认 1M,
[4]Signal Dispatcher
[3]Finalizer 执行 object 的 finalize 方法,守护线程主线程一旦退出,也跟着退出,可能不执行,所以资源可能不释放。
[2]Reference Handler
[1]main
创建线程的两种方式
Thread 对线程的抽象
Runnable 对任务的抽象
stop 为什么不建议使用,可能会导致资源得不到释放。
interrupt 中断线程, 线程并不一定会中断,只是发出了一个中断信号。设置标识中断位(JDK 里面,线程是协作式的,并不是抢占式的,操作系统是抢占式的)
interrupted 判断当前线程是否被中断,会将标志位标记为 true,使用较少
isInterrupt() 判断当前线程是否被中断,会将标志位标记为 false
//死锁状态是不会理会中断的。
start 和 run 区别:
Thread t = new Thread(); 只是构建了一个实例,
t.start 才会启动线程。
t.start 只能调用一次,内部会判断状态,会抛出异常。
run 方法是实现业务的方法,
如果调用 t.run 线程是不会启动的。仅仅是调用 run 方法而已。
线程的生命周期
start():进入就绪状态。不会立即执行,等待时间片,到了时间才会进入运行状态
yield():只会让出当前的 CPU 执行权。不会释放锁。
join():抢占当前线程。能够保证线程顺序的执行。 A join 后,B 需要等待 A 成功之后才能执行。
线程的优先级:不能控制执行顺序,当做装饰品...
1~10; 默认为 5;
t.setPriority(10);
t.setPriority(1);
守护线程:支持性的线程,做一下调度工作。主线程结束后就会跟着结束。
手动 start 的就是用户线程,非守护线程。
JDK 启动的或者参数配置的就是守护线程
t.setDaemon(true);
守护线程中 finally 从句也不一定执行。 用户线程一定会执行的
try{
}finally{
print("");
}
synchronized 内置锁 可以使用在方法上,也可以在代码块上。 锁的是某一个对象,对象锁
类锁,静态方法上面加锁。锁的是每个类拥有的唯一的 class 对象。本质还是一个对象锁
volatile 提供可见性 适用于一个线程写,多个线程读取
网友评论