Java多线程的中断原理和 interrupt() 几个方法简介

上节讲到,线程被 wait() 通知后进入等待池,可以由本线程的 interrupt() 方法解救,使本线程可以去重新竞争锁等等。是如何实现的呢?

实际上,中断仅仅是在线程对象做一个标记而已,称为中断标志。中断标志默认为false,在线程 t 调用自己的 t.interrupt() 方法后,中断标志就变成true。但是,中断标志为true实际上不会对正常运行的线程产生影响,因为正常运行的线程不会自己去检查自己的中断标志。

只有那些被阻塞的线程才会不停的检查自己的中断标志,这个阻塞包括因 wait、join、yield、而进入阻塞的线程,这些被阻塞的线程如果检查到自己的中断标志为true,就会抛出InterruptException异常。

在线程正常运行时,也可以通过中断标志做一些事情,比如利用它做分支条件、循环退出条件等。对于线程 t ,可以用 t.isInterrupted() 获取 t 的中断标志为 true or false。

public void run() {
      if(Thread.currentThread().isInterrupted()){
         System.out.println("0");
      }
      else {
         System.out.println("1");
      }
}

另外,还有Thread的静态方法 Interrupted() 方法也可以返回中断标志的状态,但是这个方法在返回结果外还会清除线程的中断标志,也就是把false置为true。而且需要注意的是 Interrupted() 作用的对象是当前运行的线程,而不是调用它的对象,毕竟它是个静态方法。例如:

Class Test {
     public static void main(String [] args) {
         Thread t = new Thread();
          t.Interrupted();
     }
}

t.Interrupted() 作用的不是线程对象 t ,而是 main 线程。

原文地址:https://www.cnblogs.com/shen-qian/p/11196432.html

时间: 2024-10-11 06:44:02

Java多线程的中断原理和 interrupt() 几个方法简介的相关文章

Java多线程:生产者消费者更佳的解决方法(确定不会出现死锁)

今天看了一片博文,讲Java多线程之线程的协作,其中作者用程序实例说明了生产者和消费者问题,但我及其他读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的例子也都存在bug,经过仔细研究发现其中的问题,并解决了,感觉有意义贴出来分享下. 下面首先贴出的是有bug的代码,一个4个类,Plate.java: package CreatorAndConsumer; import java.util.ArrayList; import java.util.List; /** * 盘子,表示共享的资源

java多线程二之线程同步的三种方法

java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Semaphore. 线程同步问题引入: 创建一个银行账户Account类,在创建并启动100个线程往同一个Account类实例里面添加一块钱.在没有使用上面三种方法的情况下: 代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Java多线程系列---“JUC原子类”01之 原子类的实现(CAS算法)

转自:https://blog.csdn.net/ls5718/article/details/52563959  & https://blog.csdn.net/mmoren/article/details/79185862(含部分修改) 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2)一个线程持有锁会导致其它所有需要此锁的线程挂起. (3)

java 多线程系列---JUC原子类(二)之AtomicLong原子类

概要 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.本章以AtomicLong对基本类型的原子类进行介绍. AtomicLong介绍和函数列表 AtomicLong是作用是对长整形进行原子操作.在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性.而使用AtomicLong能让long的操作保持原子型. AtomicLong函数列表 // 构造函数 Ato

Java多线程系列---“JUC原子类”04之 AtomicLongArray原子类

转自:https://www.cnblogs.com/skywang12345/p/3514604.html(含部分修改) 概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数组类型的原子类进行介绍.内容包括: AtomicLongArray介绍和函数列表 AtomicLongArray源码分析(基于JDK1.7.0_40) AtomicLongAr

Java多线程系列---“JUC原子类”06之 AtomicLongFieldUpdater原子类

转自:http://www.cnblogs.com/skywang12345/p/3514635.html (含部分修改) 概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员的原子类型的原理和用法相似.本章以对基本类型的原子类进行介绍.内容包括: AtomicLongFieldUpdater介绍和函数列表 AtomicLongFieldUpdater示例 AtomicL

Java多线程循环打印ABC的5种实现方法

题目:3个线程循环打印ABC,其中A打印3次,B打印2次,C打印1次,循环打印2轮一.Synchronized同步法思路:使用synchronized.wait.notifyAll的方法利用线程标记变量控制三个线程的执行顺序. /** * @author XDarker * 2018-5-17 */public class Main { public static void main(String[] args) throws InterruptedException { int num = 1

java——多线程——单例模式的static方法和非static方法是否是线程安全的?

单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static方法不是线程安全的,那么不会因为这个类使用了单例模式,而变的安全. 闲话休说,看代码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestSingl

java多线程系类:JUC原子类:03之AtomicLongArray原子类

概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数组类型的原子类进行介绍.内容包括:AtomicLongArray介绍和函数列表AtomicLongArray源码分析(基于JDK1.7.0_40)AtomicLongArray示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3514604.html