首页 > 编程语言 > 详细

多线程基础篇

时间:2020-05-08 00:23:18      阅读:53      评论:0      收藏:0      [点我收藏+]
一、进程与线程
1. 概念:

  进程是操作系统结构的基础,是一个计算机中正在运行的程序实例,是分配给处理器并由处理器执行的一个实体,是由单一顺序执行显示、描述当前状态和一组相关系统资源组成的活动单元。如打开一个浏览器就是启动浏览器进程,打开word文档,就是启动word进程。

  线程是进程执行运算的最小单位,也就是执行调度的基本单元,一个进程中至少包含一个线程。

2. 为什么会有多线程?

  多线程就像是流水线上的各部件加工,彼此独立工作,最后完成设备的生产。也就是说多线程的引用,可以将一个复杂的功能模块拆分成不同的任务来完成,这样也就大大提高了系统的性能,缩短了处理时间,提高了用户体验。

二、线程运行的状态
  • 创建状态(new):新建一个线程对象,实现的方法有四种【继承Thread类、实现Runable接口、实现Callable接口、线程池Executors框架】

 

  • 就绪状态(Runable):线程对象被创建后,调用start()方法,进程进入可运行状态参与cpu时间片的竞争,等待被调度。

 

  • 运行状态(Running):线程对象获取cpu时间片,线程被执行。

 

  • 阻塞状态(Blocked):线程放弃cpu时间片,暂停执行。

   阻塞状态分为三种:

   1)等待阻塞:运行的线程调用o.wait()方法,该线程释放所有资源,进入“等待池”(也称为等待队列)中。进入这个状态后,线程不会自动唤醒,必须依赖其他线程调用o.notify()或o.notifyAll()方法,该线程才被唤醒,进入“锁池”中。

   2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用时,JVM会将该线程放入“锁池”中。

    3)其他阻塞:运行的线程调用Thread.sleep()或者t.join()方法,或者发出I/O请求时,JVM会将该线程置为阻塞状态,当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

  • 死亡状态(Dead):线程正常执行完毕或抛出一个未处理的异常导致线程的提前结束,线程生命周期结束。

 

 

 

 技术分享图片

 三、sleep、yield、wait三者之间的区别

1)sleep和yield是Thread下的静态方法。对运行的线程调用sleep()方法,线程让出cpu时间片,睡眠指定的时间,进入阻塞状态,该过程中,线程不会释放对象锁;到期后自动恢复,进入就绪状态,参与cpu时间片的竞争。对运行的线程调用yield()方法,线程让出cpu时间片,进入就绪状态,参与cpu时间片的竞争。

2)wait和notify、notifyAll都是Object类下的方法。对运行的线程调用wait()方法,该线程释放所有资源,同时也会释放对象锁,进入“等待池”。线程不会自动唤醒,必须通过其他线程调用notify()或notifyAll()方法,线程才可被唤醒。(注意:由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取对象的锁标记。

3)【延伸】同wait()需要搭配notify()或notifyAll()成对出现一样,suspend()需要搭配resume()使用,区别在于wait()会释放对象的锁,而suspend()不会释放对象的锁。另外,suspend()方法和不指定超时期限的wait()方法的调用都可能产生死锁。

多线程基础篇

原文:https://www.cnblogs.com/light-sunset/p/12840275.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!