并发的基础

程序、进程和线程:

 

进程:是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。

线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比程序更小的能独立运行的基本单位。一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行

 

单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。如果是多核的话,才能更好的发挥多线程的效率。

 

一个Java应用程序java.exe,其实至少有三个线程:main()主线程gc()垃圾回收线程异常处理线程。当然如果发生异常,会影响主线程。

 

并行与并发:

并行:多个CPU同时执行多个任务

并发:一个CPU(采用时间片)同时执行多个任务

通常既有并发也有并行。

 

线程的优先级和调度:

我们可以“建议”操作系统给某些线程多分配一点执行时间,但线程优先级并不是一项稳定的调节手段, 很显然因为主流虚拟机上的Java线程是被映射到系统的原生线程上来实现的, 所以线程调度最终还是由操作系统说了算。 如果 cpu 比较忙,那么优先级高的线程会获得更多的时间片,但 cpu 闲时,优先级几乎没作用

 

定义优先级:MAX_PRIORITY:10 ;MIN _PRIORITY:1 ;NORM_PRIORITY:5(默认优先级)

相同优先级的线程由CPU执行时间片调度(抢占式调度),随机调度,两种线程输出有交叉;高优先级线程也执行时间片调度,高优先级线程执行概率较高,和低优先级交叉概率较低。

▲注意:如果在主线程中启动多线程的代码相连,那么先执行哪个线程不由start顺序决定。

 

java中线程的分类:

用户线程:平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程。默认都是用户线程。

守护线程:是服务线程,准确地来说就是服务其他的线程,这是它的作用。一般守护线程是一个死循环,所有的用户线程结束后,守护线程会自动结束。

区别在于:

用户线程:当存在任何一个用户线程未离开,JVM是不会离开的。

守护线程:如果只剩下守护线程未离开,JVM是可以离开的。

转换:

用户线程:thread.setDaemon(false)

守护线程:thread.setDaemon(true)

 

垃圾回收线程是一个守护线程。

 

上下文切换

多线程会共同使用一组计算机上的CPU,而线程数大于给程序分配的CPU数量时,为了让各个线程都有执行的机会,就需要轮流使用CPU。不同的线程切换使用CPU发生的数据切换等就是上下文切换

 

线程运行的原理:

栈是线程来使用的,每个线程有自己的栈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值