多线程相关基础

什么是进程(Process)和线程(Thread)?

进程是资源分配的最小单位,线程是CPU调度的最小单位。这个回答大家都知道,但是过于抽象。如果面试中问到,面试官并不是想让你重复这句话,他想要的是结合自己的理解进行解释说明。

进程(Process),从英文角度来讲Process不仅是进程,也是过程,拿到计算机里面来解释就是一段程序的执行过程。例如,当我们打开计算机,运行QQ的时候,是把QQ.exe这个程序从外存拿到了内存去运行,此时就会产生一个进程。当启动一个进程的时候,至少会启动一个主线程(Main Thread)。如果当前运行的程序需要多个任务(Task)协调运行,那么就会产生多个线程(Thread)。一个系统中,有很多进程,它们都会使用内存。为了确保内存不被别人使用,每个进程所能访问的内存都是划定好的,每个程序运行过程互不影响。

什么是并发和并行?

并发:同一时间段内,多个程序在运行。

并行:同一时刻,计算机的多个CPU执行多个进程,互不影响。

看起来它们虽然都说是"多个进程同时运行",但是它们的"同时"不是一个概念。并行的"同时"是同一时刻可以多个进程在运行(处于running),并发的"同时"是经过上下文快速切换(Context Switch),使得看上去多个进程同时都在运行的现象,是一种同时运行的假象。实际上,当程序中写下多进程或多线程代码时,这意味着的是并发而不是并行。

上下文切换简单来说就是CPU对进程或线程进行切换。因为CPU是按照时间片给每个线程分配执行的时间,当A线程的时间片用完,要切换到B线程,此时就需要保存A线程当前的状态,等到下一次A线程得到CPU的时间片再恢复到运行时的状态。所以并不是线程越多越快,多线程编程时要考虑到上下文切换的开销。

JAVA实现多线程的方式:

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口

优缺点也是显而易见的,JAVA是单继承多实现的语言,所以如果需要继承其他类就考虑实现接口的方式。两个接口也是有区别的,Runnable接口没有返回值,只需要执行完毕就可以,Callable可以有返回值可以抛异常(通过FutureTask获取)。在实际使用过程中,通常结合线程池一起使用。

线程的5种状态:

新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)。

线程状态转换

 

线程何时终止运行:

1.任务执行完毕

2.任务抛异常

3.使用 stop() 强制停止运行。这个方法不释放资源,可能会导致死锁的问题,是个过时的方法不建议使用。

Java中interrupt、interrupted和isInterrupted的关系与区别:

interrupt():给线程一个中断信号,需要用户根据业务具体处理

isInterrupted():查看线程是否中断,中断标志位为true则中断

interrupted():静态方法,查看线程是否中断,会清除中断标志

JAVA中volatile和synchronized:

volatile:保证共享资源的可见性,不保证原子性

synchronized:对象锁,由JVM实现,如果修饰静态类为类锁(锁class)

JAVA中wait()、notify()、notifyAll():

三者都为Object的方法,一般结合synchronized关键字使用

wait():阻塞等待

notify():通知唤醒一个线程

notifyAll():通知唤醒所有线程

通知等待范式:

等待方:1.获取对象锁 2.循环判断条件是否满足,满足则执行业务,不满足则wait()

通知方:1.获取对象锁 2.改变条件 3.notifyAll()通知等待线程 (使用notify可能会出现信号丢失)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值