当前位置: 首页 > news >正文

java之多线程的理解

线程的属性

(1)线程的状态

    线程在它的生命周期中可能处于以下几种状态之一:
  • New(新生):线程对象刚刚被创建出来;
  • Runnable(可运行):在线程对象上调用start方法后,相应线程便会进入Runnable状态,若被线程调度程序调度,这个线程便会成为当前运行(Running)的线程;
  • Blocked(被阻塞):若一段代码被线程A”上锁“,此时线程B尝试执行这段代码,线程B就会进入Blocked状态;
  • Waiting(等待):当线程等待另一个线程通知线程调度器一个条件时,它本身就会进入Waiting状态;
  • Time Waiting(计时等待):计时等待与等待的区别是,线程只等待一定的时间,若超时则不再等待;
  • Terminated(被终止):线程的run方法执行完毕或者由于一个未捕获的异常导致run方法意外终止会进入Terminated状态。

    后文中若不加特殊说明的话,我们会用阻塞状态统一指代Blocked、Waiting、Time Waiting。    

 

(2)线程的优先级

    在Java中,每个线程都有一个优先级,默认情况下,线程会继承它的父线程的优先级。可以用setPriority方法来改变线程的优先级。Java中定 义了三个描述线程优先级的常量:MAX_PRIORITY、NORM_PRIORITY、MIN_PRIORITY。
    每当线程调度器要调度一个新的线程时,它会首先选择优先级较高的线程。然而线程优先级是高度依赖与操作系统的,在有些系统的Java虚拟机中,甚至会忽略线程的优先级。因此我们不应该将程序逻辑的正确性依赖于优先级。线程优先级相关的API如下:
void setPriority(int newPriority) //设置线程的优先级,可以使用系统提供的三个优先级常量
static void yield() //使当前线程处于让步状态,这样当存在其他优先级大于等于本线程的线程时,线程调度程序会调用那个线程

 

Thread 类。方法:

        1.sleep :休眠;这是一个静态方法,作用是让当前线程进入休眠状态(但线程不会释放已获取的锁),这个休眠状态其实就是我们上面提到过的Time Waiting状态,从休眠状态“苏醒”后,线程会进入到Runnable状态。sleep方法有两个重载版本,声明分别如下:

public static native void sleep(long millis) throws InterruptedException; //让当前线程休眠millis指定的毫秒数 public static native void sleep(long millis, int nanos) throws InterruptedException; //在毫秒数的基础上还指定了纳秒数,控制粒度更加精细

       2. join方法,这是一个实例方法,在当前线程中对一个线程对象调用join方法会导致当前线程停止运行,等那个线程运行完毕后再接着运行当前线程。也就是说,把当前线程还没执行的部分“接到”另一个线程后面去,另一个线程运行完毕后,当前线程再接着运行。join方法有以下重载版本:

public final synchronized void join() throws InterruptedException public final synchronized void join(long millis) throws InterruptedException; public final synchronized void join(long millis, int nanos) throws InterruptedException;

        无参数的join表示当前线程一直等到另一个线程运行完毕,这种情况下当前线程会处于Wating状态;带参数的表示当前线程只等待指定的时间,这种情况下当前线程会处于Time Waiting状态。当前线程通过调用join方法进入Time Waiting或Waiting状态后,会释放已经获取的锁。实际上,join方法内部调用了Object类的实例方法wait,关于这个方法我们下面会具体介绍。

 

转载于:https://www.cnblogs.com/zhaoyi-sp/p/6266148.html

相关文章:

  • json常用方法介绍
  • NSOperation 开发
  • 批量更新MongoDB的列。
  • SOA是什么
  • Apache HttpCore (理解IO基础)
  • 启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决
  • 软件项目技术点(3)——多画布职责分离
  • 浅尝springboot中的Actuator包(一)
  • 【使用教程】论Windows下必备的抓包工具Fiddler2如何安装证书(查看Https)
  • RPC学习
  • js动画(三)
  • Django admin 自定制
  • B4X 大疆 dji开发
  • 微软Azure首席架构师John Gossman就微软加入Linux基金会一事答疑
  • mysql5.5以上my.ini中设置字符集
  • [译] React v16.8: 含有Hooks的版本
  • 《Java编程思想》读书笔记-对象导论
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Android开源项目规范总结
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Codepen 每日精选(2018-3-25)
  • css选择器
  • express + mock 让前后台并行开发
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • IDEA 插件开发入门教程
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Sass 快速入门教程
  • Tornado学习笔记(1)
  • Vue 2.3、2.4 知识点小结
  • Vue小说阅读器(仿追书神器)
  • 大数据与云计算学习:数据分析(二)
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 搞机器学习要哪些技能
  • 记一次和乔布斯合作最难忘的经历
  • 简单数学运算程序(不定期更新)
  • 力扣(LeetCode)21
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 在Unity中实现一个简单的消息管理器
  • 正则学习笔记
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (分布式缓存)Redis分片集群
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (过滤器)Filter和(监听器)listener
  • (一)RocketMQ初步认识
  • (转) Face-Resources
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .equals()到底是什么意思?