博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程概述
阅读量:6583 次
发布时间:2019-06-24

本文共 1153 字,大约阅读时间需要 3 分钟。

  多线程编程一直是学员们比较头痛和心虚的地方,因为线程执行顺序的不可预知性和调试时候的困难,让不少人在面对多线程的情况下选择了逃避,采用单线程的方式,其实只要我们对线程有了明确的认识,再加上java内置的对多线程的天然支持,多线程编程不再是一道难以逾越的鸿沟。

JVM与多线程

Java编写的程序都运行在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。

每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行的。JVM找到程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。

操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段时间(不一定是均分),然后在每个进程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。

线程的状态切换

 由于线程何时执行是未知的,只有在CPU为线程分配到时间片时,线程才能真正执行。在线程执行的过程中,由可能会因为各种各样的原因而暂停(就像前面所举的例子一样:汽车只有在交通灯变绿的时候才能够通行,而且在行驶的过程中可能会出现塞车,等待其它车辆通行或转弯的状况)。

这样线程就有了“状态”的概念,下面这副图很好的反映了线程在不同情况下的状态变化。

 

  • 新建状态(New):新创建了一个线程对象。
  • 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
  • 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
  • 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
  1. 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
  2. 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM把该线程放入锁。
  3. 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

转载于:https://www.cnblogs.com/zzj-123465/p/5283366.html

你可能感兴趣的文章
Windows Server 2003升级Win Ser 2008R2之域架构扩展报错
查看>>
elk6.3.1+zookeeper+kafka+filebeat收集dockerswarm容器日志
查看>>
passwd文件和shadow文件
查看>>
(Portal 开发读书笔记)DispatcherPortlet
查看>>
互联网开放平台的深入思考
查看>>
Kotlin语言的优缺点简介及提出的一点建议
查看>>
keealived安装
查看>>
Dubbo概述
查看>>
select2 demo
查看>>
集成的HTTP嗅探器HttpWatch更新至v11.0.20,增加网络错误的数据提示
查看>>
常用的 wget 参数详解
查看>>
MySql删除数据 not in 用法
查看>>
Angular内置指令--通用指令
查看>>
精通Spring+4.x++企业开发与实践之SpEL
查看>>
好博客地址推荐(长期更新)
查看>>
Android零基础入门第43节:ListView优化和列表首尾使用
查看>>
table实现等高的优势
查看>>
oracle 11g dataguard 使用快照实现临时读写
查看>>
阿里云人才市场,百家公司、近千职位等你加入!
查看>>
不同时间阶段的seo优化技术侧重点
查看>>