美文网首页
多线程 2020-11-17

多线程 2020-11-17

作者: _一叶孤帆 | 来源:发表于2020-11-26 18:35 被阅读0次

线程: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 提供可见性 适用于一个线程写,多个线程读取

相关文章

网友评论

      本文标题:多线程 2020-11-17

      本文链接:https://www.haomeiwen.com/subject/nrkfiktx.html