1:进程与线程

1、了解进程与线程

cpu核心数和线程数的关系

最早是一块cpu上只有一个核心数, 一般核心数与线程是1:1, 但Inter引入了多线程的概念,
核心数与线程就变成了1:2的关系

cpu时间片轮转机制

CPU执行一条指令,大约花费0.6ns
4核的cpu支持8个线程,但是操作系统并没有限制只能启动8个线程,因为有个RR(时间片)调度,cpu运行的时间分成一个一个小段,没有进程被分配一个小段,也就是这个进程的分片,cpu去调度分片,在切换过程中,操作系统会保存数据,带入下个进程,这个过程称为上下文切换。因为切换会消耗资源,所以要控制线程数,就是要控制上下文切换的效率

什么是进程和线程

进程:资源分配的最小单位
线程: cpu调度的最小单位,共享进程中的资源,不能单独存在,必须依附于某一个进程,至少拥有一个进程。

澄清并行与并发

并行:高速路有8个出口,那么说这个高速路的并行数是8
并发:与时间有关,脱离时间就无意义啦,若在高速路上,8车道每秒能通过1台车,1分钟的并发量为60*8=480。

cpu核心数和线程数的关系

线程的安全,因为是共享资源的,所以可能造成数据的不安全
1、充分利用cpu的资源
2、加快用户响应的时间
3、模块化、异步化

2、认识Java里的线程

Java里的程序天生就是多线程的,name有多重新启动线程的方式呢?

1:继承Thread类
2:实现Runable接口
3:实现Callable接口

有开始就有结束,怎么样才能让Java里的线程安全停止工作呢?

stop() 强制地中断一个线程,可能造成数据的错乱,已废弃
suspend() 把当前的程序挂起,进入睡眠状态,不释放已经占有的资源,容易造成死锁,已废弃

interrupt()不会去中断一个线程,只是把中断标志位 置为true。若一个线程被标志为true,也不会被中断,也可以不理会这个请求,因为Java里的线程是协作式的,而不是抢占式的。
isInterrupted():检查一个线程是否要求被中断,然后再方法内interrupt()掉
static方法interrupted():判断线程是否处于中断状态
如果某一个方法会抛出InterruptedException,线程的终端标志位会被复位成false,不会被中断,如果要中断,必须在catch语句块中自行调用interrpt去中断

3、对Java里的线程在多一点点认识

线程状态 线程常用方法和线程的状态
YieId 方法,是让当前线程让出cpu时间,操作系统依然可以选中当前线程。
Join方法, 让Join方法执行完成以后,才能让调用Join方法的进程继续执行下去。
notify方法,
notifyAll方法,
sleep方法,
wait方法,
线程的优先级:通过函数setPriority的方法是不可靠的
守护线程:是一种支持式线程,例如垃圾回收,如果主程序运行完,不管垃圾回收是否完成,主程序都会终止,如果让普通线程成为守护线程呢? 用函数setDaemon方法, 一定要在start方法之前设置才有效,
守护线程里面的 finally块不一定会执行

4、线程之间的共享

synchronized内置锁
1、用处
2、对象锁
3、类锁
volatile关键字,最轻量的同步机制
ThreadLocal的使用

5、线程间的协作

轮询:难以保证及时性,资源开销大,于是出现了等待和通知机制
等待和通知
wait:对象上的方法
notify和notifyAll :
等待方:
1、获取对象的锁
2、循环里判断条件是否满足,不满足调用wait方法
通知方:
1、获取对象的锁
2、改变条件
3、通知所有等待在对象的锁

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值