高并发学习(一)—— 进程、线程

程序、进程与线程

何为程序?何为进程?何为线程?

程序是一个静态的数据和算法的集合。比如过开发工具IDEA是一个程序 。
进程是程序的一次执行过程,是系统运行程序的基本单位,是一个动态的过程。比如打开IDEA开发工具。
线程是是进程的一个执行流,是CPU调度和分派的基本单位。比如打开IDEA之后加载jar包、代码提示、语义检测这些都是由IDEA进程下的一些线程执行的。

进程和线程之间的关系

在这里插入图片描述

  1. 线程是进程执行的更小单位。是更一个轻量级的概念。比如说,web服务器,接受到一个请求,可以fork一个子进程来处理,也可以在进程内部创建一个新线程来处理。线程的话会更轻便一些。
  2. 进程之间是独立的,而各线程则不一定。同一进程中的线程极有可能会相互影响
  3. 线程开销小,但不利于资源的管理和保护,因为他们不会改变进程对内存等资源的管理,线程之间是共享这些内存的。进程需要管理好它的资源(这个资源包括内存、打开的文件、映射的网络端口等等都是进程独有的)

线程执行的过程

在这里插入图片描述
可运行状态Runnable包括就绪和运行状态。

线程

线程终止的方法

  1. 当线程完成任务后,会自动退出。
  2. 通过使用信号量以通知的方式来控制run方法的退出从而停止线程。

常用方法

在这里插入图片描述

interrupt 中断线程,但并没有真正的结束线程,所以一般用于中断正在休眠线程。如在主线程中调用t1.interrupt(),来中断t1线程的休眠。

yield: 线程礼让。让出CPU,让其他线程执行,但礼让的时间并不确定,所以也不一定礼让成功。在准备礼让的线程调用Thread.yield();
join: 线程插队。插队的线程一旦插队成功,则肯定先执行完插入线程的所有任务。比如在t2线程中调用,t1.join(),会先执行完t1的所有任务之后再 执行t2.

线程的分类

用户线程: 也叫工作线程,当线程的任务执行完或通知方式结束。
守护线程: 一般是为了用户线程服务的,当所有用户线程结束,守护线程自动结束。常见的守护线程有垃圾回收机制。

主线程结束,由主线程创建的子线程不一定结束?

如果希望当main线程结束后,子线程自动结束,只需将子线程设为守护线程即可。比如希望在main线程结束后子线程myDaemon自动结束。那么在main线程中myDaemon.setDaemon(true)。 将子线程设为守护线程。

线程状态

在这里插入图片描述

官方标明的是6个状态。但实际上如果Runnable细分的话可以分为 就绪(Ready)和运行时(Running)状态。可以分为7个状态。

线程状态转换

在这里插入图片描述

一个线程被创建时处于New状态,只有处于New状态的线程才会执行start方法,该方法调用本地start0方法,在Java运行时内存区域开辟方法栈和程序计数器。之后线程进入Runnable状态中的Ready就绪状态,只有获得了CPU时间才能由就绪状态进入Running运行时状态。

超时等待状态(TimeWaiting) :线程由Runnable状态调用线程睡眠Thread.sleep(time)、线程超时等待o.wait(time)、线程插队(t.join(time) )
等待状态(Waiting):与上面类似,只不过是调用了没有时间参数的上述方法。 t.join(),o.wait().。
阻塞状态(Blocked): 线程处于争夺锁状态。
终止状态(Terminate):线程执行结束后自动退出或以通知的方式退出。

互斥锁

在这里插入图片描述

在这里插入图片描述

释放锁

在这里插入图片描述
在这里插入图片描述

参考资料;

作品【韩顺平讲Java】一天学会线程 Thread Synchronized

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值