java线程——中断线程+线程状态+线程属性(优先级)

【0】README

0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程——中断线程+线程状态+线程属性(优先级) 的相关知识;


【1】中断线程

1.1)当线程的run方法执行方法体中最后一条语句后, 并经由return语句返回时, 或出现了在方法中没有捕获的异常时,线程将终止;
1.2)强制线程终止: interrupt 方法可以用来请求终止线程;

  • 1.2.1)判断线程是否已经终止: Thread.currentThread().isInterrupted()
  • 1.2.2)但是,如果线程被阻塞, 就无法检测中断状态,这是产生 InterruptedException异常的地方;
public void run()
{try{while(!Thread.currentThread().isInterrupted()).....}catch(){}finally(){}
}
  • 1.2.3)中断状态时的线程调用 sleep, 不仅不会休眠, 相反, 抛出IntertupptedException;

Annotation)有两个非常类似的方法, interrupted 和 isInterrupted

  • A1)Interrupted 方法是一个静态方法: 它检测当前的线程是否中断, 而且,该方法会清除该线程的中断状态;
  • A2)isInterrupted 方法是一个实例方法: 可用来检验是否有线程被中断, 调用这个方法不会改变中断状态;

1.3)有两种方法用来抛出 InterrupttedException

  • 1.3.1)在catch 子句中调用 Thread.currentThread().interrrupt() 来设置中断状态;
void fun()
{try{}catch(){ Thread.currentThread().interrupte();}
}
  • 1.3.2)或者用throws 标记你的方法, 不采用 try 语句块捕获这个异常
void func() throws InterruptedException
{sleep(delay);
}

【2】线程状态

2.1)线程有6种状态(status):

  • S1) new(新创建);
  • S2) Runnable(可运行);
  • S3) Blocked(被阻塞);
  • S4) Waiting(等待);
  • S5) Timed waiting(计时等待);
  • S6) Terminated(被终止);
  • Attention)记住, 在任何时刻,一个可运行线程可能正在运行也可能没有运行(这就是为什么将这个状态称为 可运行而不是 运行);

【3】被阻塞线程和等待线程

3.1)阻塞状态:当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有, 则该线程进入阻塞状态;
3.2)等待状态:当线程等待另一个线程通知调度器一个条件时, 它进入等待状态;(在调用 Object.wait 或 Thread.join 方法 或是等待java.util.concurrent 库中的Lock 或 Condition时, 就会出现这种case);
3.3)超时参数:调用它们导致线程进入计时等待状态, 这一状态将一直保持到超时期满或者接收到适当的通知, 方法有:Thread.sleep , Object.wait, Thread.join, Lock.tryLock ,Condition.await;


【4】被终止的线程

4.0)终止的原因(Reasons):

  • R1)因为run方法正常退出而终止;
  • R2)因为一个没有捕获的异常终止了run方法而意外死亡;
    这里写图片描述

  • M1)start方法:开启线程(抑或是分配CPU), 它执行Runnable接口的 run 方法;

  • M2)yield()方法的作用是:暂停当前正在执行的线程对象,并执行其他线程。;
  • M3)Thread的非静态方法join()方法:让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。例如:
Thread t = new MyThread();
t.start();
t.join();
  • M3.1)另外,join()方法还有带超时限制的重载版本。 例如t.join(5000);则让线程等待5000毫秒,如果超过这个时间,则停止等待,变为可运行状态。
    线程的加入join()对线程栈导致的结果是线程栈发生了变化,当然这些变化都是瞬时的。下面给示意图
    这里写图片描述
  • M4)Thread.sleep方法: 使当前线程睡眠至少多少毫秒
  • M5) void notify() : 唤醒在此对象监视器上等待的单个线程。
  • M6) void notifyAll(): 唤醒在此对象监视器上等待的所有线程。
  • M7) void wait() :导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
  • M8)synchronized : 同步方法或同步块的关键字;

【5】线程属性

5.1)线程优先级

  • 5.1.1)设置线程的优先级:线程默认的优先级是创建它的执行线程的优先级。可以通过setPriority(int newPriority)更改线程的优先级。例如:
Thread t = new MyThread();
t.setPriority(8);
t.start();
  • 线程优先级为1~10之间的正整数,JVM从不会改变一个线程的优先级。
    • 5.1.1.1)线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:
    • 5.1.1.2)static int MAX_PRIORITY :线程可以具有的最高优先级。
    • 5.1.1.3)static int MIN_PRIORITY :线程可以具有的最低优先级。
    • 5.1.1.4)static int NORM_PRIORITY :分配给线程的默认优先级 == 5。

5.2)守护线程

  • 5.2.1)通过调用 t.setDaemon(true) 来将线程转换为 守护线程(daemon thread);
  • 5.2.2)守护线程的唯一用途: 为其他线程提供服务;
  • 5.2.3)看个荔枝:计时线程就是一个荔枝。它定时发送“计时器滴答”信号给其他线程或清空过时的高速缓存项的线程。当只剩下守护线程时, 虚拟机就退出了,因为如果只有守护线程, 就没必要继续运行程序了;

5.3)未捕获异常处理器

  • 5.3.1)出现的问题: 线程的run方法不能抛出任何被检测的异常, 但是,不被检测的异常会导致线程死亡;
  • 5.3.2)解决方法:在线程死亡之前, 异常被传递到一个用于未捕获异常的处理器;
    • 5.3.2.1)该处理器必须属于一个实现了 Thread.UncaughtExceptionHandler 接口的类。 这个接口只有一个方法: void uncaughtExceptionHandler ;
    • 5.3.2.2)可以用 setUncaughtExceptionHandler 方法为任何线程安装一个 处理器。 也可以用 Thread的静态方法 setDefaultUncaughtExceptionHandler 为所有线程安装一个默认处理器;
    • 5.3.2.3)如果不安装默认的处理器, 默认处理器就为空。 但是,如果不为独立的线程安装处理器,此时的处理器就是该线程的 ThreadGroup 对象了;(但是建议,不要在程序中使用线程组 ThreadGroup);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#的protected internal

关于C#的 protected internal,也许你在网上可以找到两种解释:第一种解释是,protected or internal ,即在本程序集或其他程序集继承的子类可以访问。 第二种解释是,protected and internal,即在本类或本程序…

pae扩展内存 linux,浅析linux内核内存管理之PAE

浅析linux内核内存管理之PAE早期Intel处理器从80386到Pentium使用32位物理地址,理论上,这样可以访问4GB的RAM。然而,大型服务器需要大于4GB的RAM来同时运行数以千计的进程,近几年来这对Intel造成了压力,所以必须扩展32…

java线程同步——竞争条件的荔枝+锁对象

【0】README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步——竞争条件的荔枝锁对象 的相关知识; 0.2) for full source code, please visit https://github.com/pacosonTang/core-ja…

Hibernate框架

一、Hibernate概述 1、Hibernate是一个基于元数据的轻量级的ORM框架。 (1)元数据(Meta Data):data about data(数据的数据),也就是说描述一个对象数据,相当于这个对象的上下文环境。 (2)轻量级:占用资源少&am…

java 线性回归算法_线性搜索或顺序搜索算法在Java中如何工作? 示例教程

java 线性回归算法大家好,之前,我讨论了二进制搜索算法的工作原理,并分享了在Java中实现二进制搜索的代码。 在那篇文章中,有人问我是否还有其他搜索算法? 如果数组中的元素未排序,又该如何使用它而不能使用…

linux安装i219网卡驱动下载,华硕E500 G5 (-INTEL I210 / I219-LM)网卡驱动12.17.10.7版下载,适用于Win10-64-驱动精灵...

驱动说明:-Windows-Intel(R) I210 Gigabit Network Connection with I/O Acceleration Technology (Intel(R) I/OAT) Software Version 23.2.0.1006 WHQL driver V12.14.7.0 for Windows Server 2012 R2 64 bit. Software Version 23.2.0.1006 WHQL driver V12.15.1…

java线程同步——条件对象+synchronized 关键字

【0】README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步——条件对象synchronized 关键字 的相关知识; 0.2)for full source code : https://github.com/pacosonTang/co…

Hibernate之必须导入jar包

Hibernate必须导入的包 hibernate是ORM的解决方案,其底层对数据库的操作依赖于JDBC,所以必须先取得JDBC驱动程序,在这使用的是MySQL,所以必须至先取得MySQL的JDBC驱动程序 https://dev.mysql.com/downloads/connector/j/ Hibern…

赞扬别人团建评论_赞扬精心设计:基于属性的测试如何帮助我成为更好的开发人员...

赞扬别人团建评论开发人员的测试工具箱就是其中之一,很少保持不变。 可以肯定的是,一些测试实践已被证明比其他测试更有价值,但是,我们仍在不断寻找更好,更快和更具表现力的方法来测试我们的代码。 基于属性的测试 是 …

linux c read函数返回值,Linuxc - GNU Readline 库及编程简介

GNU Readline 库及编程简介简介用过 Bash 命令行的一定知道,Bash 有几个特性:TAB 键可以用来命令补全↑ 或 ↓ 键可以用来快速输入历史命令还有一些交互式行编辑快捷键:C-A / C-E 将光标移到行首/行尾C-B / C-F 将光标向左/向右移动一个位置C…

java泛型——桥方法

【0】README 0.1)以下内容转自: http://www.cnblogs.com/ggjucheng/p/3352519.html 【1】泛型约束和局限性—— 类型擦除所带来的麻烦 1.1)继承泛型类型的多态麻烦。(—— 子类没有覆盖住父类的方法 ) 看看下面这个…

Hibernate框架之入门配置

一、Hibernate导入相关的包参考:http://blog.csdn.net/tunni/article/details/54982160这些包包括相应数据库驱动、hibernate.zip下lib目录下的jar包,其中必须包是required目录下的.jar二、在项目classpath(类路径,即src目录下&am…

annotations_Spring Annotations我从来没有机会使用第2部分:@ConfigurationProperties

annotations几天前,我在检查其他内容时不小心偶然发现了Spring Boot项目中的Spring注释。 我们都知道如何将带有“ Value”的属性值绑定到类,并且我们都知道如果要绑定多个属性,这可能会很麻烦。 Spring Boot可以为您提供帮助。 您可以使用“…

linux下检测硬盘,【转载】linux下硬盘监控诊断工具SmartTools

对于windwos下raid卡具备告警功能,当硬盘故障、raid卡告警时,可以发邮件给管理员。IBM、HP、Dell都支持。但在linux下,就没有找到相关的好工具了,今天到陈沙克的博客上到一篇关于linux下硬盘监控诊断工具SmartTools,感…

hibernate框架之主键生成

一、 hibernate 框架中主键的生成策略 (1)native: 表示由设置的方言决定采用什么数据库生成主键方式,根据底层数据库能力选择identity、sequence中的一个。 例如:在MySQL中会采用自增长的方式,主键字段必须都是整形类型;在Oracle数…

java泛型通配符

【0】README 0.1)以下内容转自: http://blog.csdn.net/baple/article/details/25056169 0.2) T 有类型 ? 未知类型 一、通配符的上界(extends关键字) 既然知道List并不是List的子类型,那就需…

jdk 1.8 内存可见性_JDK 14中的常规,安全和确定性外部内存访问

jdk 1.8 内存可见性在“ JDK 14 Rampdown:Build 27 ”一文中,我总结了JDK 14 Early Access Build #27中新增的许多针对JDK 14的功能。 已经存在另一种JDK 14 Early Access Build,并且此[ Build 28(2019/12/18&#xff…

linux开启防火墙ping,如何在防火墙中放开ping

如何在防火墙中放开ping操作时需要注意的几项:1,注意iptables各版本间的区别我们的server os最旧的版本是redhat 7.3 kernel是2.4.20-18.7最新的server os最新的版本是centos 5, kernel是2.6.18-8差距很大iptables以模块形式运行在内核的空间,用lsmod可以看到所以它与内核的版本…

Hibernate: You have an error in your SQL syntax; check the manual that corresponds to your MySQL

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ...Hibernate 出现这样的错误是因为表中的字段名使用了sql的保留字,不要使用保留字 一、mysql的保留字主要有&#xff1…

java.io 包

java.io 通过数据流、序列化和文件系统提供系统输入和输出。 请参见: 接口摘要CloseableCloseable 是可以关闭的数据源或目标。DataInputDataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构。DataOutputDataOutput 接口用…