java多线程 interrupt(), interrupted(), isInterrupted()方法区别

interrupt()方法: 作用是中断线程。

  • 本线程中断自身是被允许的,且"中断标记"设置为true
  • 其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。 
    • 若线程在阻塞状态时,调用了它的interrupt()方法,那么它的“中断状态”会被清除并且会收到一个InterruptedException异常。

      • 例如,线程通过wait()进入阻塞状态,此时通过interrupt()中断该线程;调用interrupt()会立即将线程的中断标记设为“true”,但是由于线程处于阻塞状态,所以该“中断标记”会立即被清除为“false”,同时,会产生一个InterruptedException的异常。
    • 如果线程被阻塞在一个Selector选择器中,那么通过interrupt()中断它时;线程的中断标记会被设置为true,并且它会立即从选择操作中返回。
    • 如果不属于前面所说的情况,那么通过interrupt()中断线程时,它的中断标记会被设置为“true”。

interrupted()方法

判断的是当前线程是否处于中断状态。是类的静态方法,同时会清除线程的中断状态。

 

1 public static boolean interrupted() {
2   return currentThread().isInterrupted(true);
3 }

isInterrupted()方法

判断调用线程是否处于中断状态 
例如:

public static void main(String[] args){
  Thread thread = new Thread(()->{}); //定义一个线程,伪代码没有具体实现
  thread.isInterrupted();//判断thread是否处于中断状态,而不是主线程是否处于中断状态
  Thread.isInterrupted(); //判断主线程是否处于中断状态
}

线程停止

  • 通过“中断标记”终止线程。
@Override
public void run() {
  while (!isInterrupted()) {
// 执行任务...
  }
}

说明:isInterrupted()是判断线程的中断标记是不是为true。当线程处于运行状态,并且我们需要终止它时;可以调用线程的interrupt()方法,使用线程的中断标记为true,即isInterrupted()会返回true。此时,就会退出while循环。 
注意:interrupt()并不会终止处于“运行状态”的线程!它会将线程的中断标记设为true。

  • 通过“额外添加标记”。

  

private volatile boolean flag= true;
protected void stopTask() {
  flag = false;
  }
  @Override
  public void run() {
  while (flag) {
  // 执行任务...
  }
}

说明:线程中有一个flag标记,它的默认值是true;并且我们提供stopTask()来设置flag标记。当我们需要终止该线程时,调用该线程的stopTask()方法就可以让线程退出while循环。 
注意:将flag定义为volatile类型,是为了保证flag的可见性。即其它线程通过stopTask()修改了flag之后,本线程能看到修改后的flag的值。

综合线程处于“阻塞状态”和“运行状态”的终止方式,比较通用的终止线程的形式如下:

@Override
public void run() {
  try {
  // 1. isInterrupted()保证,只要中断标记为true就终止线程。
  while (!isInterrupted()) {
  // 执行任务...
  }
  } catch (InterruptedException ie) {
  // 2. InterruptedException异常保证,当InterruptedException异常产生时,线程被终止。
  }
}
时间: 2024-11-11 12:20:24

java多线程 interrupt(), interrupted(), isInterrupted()方法区别的相关文章

java 多线程sleep和wait的区别

对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态. 在调用sleep()方法的过程中,线程不会释放对象锁. 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备 获取对象锁进入运行状态. 什么意思呢?

interrupt interrupted isInterrupted 区别

1.interrupt interrupt方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己去监视线程的状态为并做处理.支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为"中断状态",就会抛出中断异常. 2.interrupted 和 isInterrupted 首先看一下该方法的实现: 1 pu

线程停止(stop() interrupt() interrupted() isInterrupted())

stop() 强制停止线程:已经弃用:可能造成数据不一致等问题. interrupt() 在线程中做停止标记,并非真的停止线程. this.interrupted()测试当前线程是否中断,并清除中断状态. this.isInterrupted() 测试线程是否已经中断. 方法声明: public static boolean interrupted()  静态方法 public boolean isInterrupted()       非静态方法 例子: package ThreadTest2

多线程-interrupt(),isInterrupted(),interrupted()(转)

Content 背景 中断 相关方法 阻塞方法 不可中断的阻塞方法 处理不支持中断的线程中断的常用方法 处理InterruptedException 待决中断 实例1 实例2 参考资料 Top 背景 由于使用stop方法停止线程非常暴力,可能会导致一系列问题.因此,提出一种温和的方式:请求另外一个先不要在执行了,这就是中断方式. 此外有这样的场景:编写 一个程序,需要暂停一段时间,于是调用Thread.sleep(),但是编译器或IDE报错说没有处理检查到的InterruptedExceptio

JAVA线程sleep和wait方法区别

一 sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁.由于没有释放对象锁,所以不能调用里面的同步方法. sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用.目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;sleep()是Thread类的Static(静态)的方法:因此他不能改变对象的机锁,所以当在一个Synchronized块

【JAVA多线程中使用的方法】

一.sleep和wait的区别. 1.wait可以指定时间,也可以不指定. 而sleep必须制定. 2.在同步的时候,对于CPU的执行权和以及锁的处理不同. wait:释放执行权,释放锁. sleep:释放执行权,不释放锁. 二.线程是否安全? 1 class Test implements Runnable 2 { 3 public synchronized void show() 4 { 5 try 6 { 7 wait(); 8 } 9 catch (InterruptedExceptio

java多线程 sleep()和wait()的区别

接触了一些多线程的东西,还是从java入手吧. 相信看这篇文章的朋友都已经知道进程和线程的区别,也都知道了为什么要使用多线程了. 这两个方法主要来源是,sleep用于线程控制,而wait用于线程间的通信,与wait配套的方法还有notify和notifyAll. 区别一: sleep是Thread类的方法,是线程用来 控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次.就像个闹钟一样. wait是Object类

Java多线程中的join方法

新建一个Thread,代码如下: 1 package com.thread.test; 2 3 public class MyThread extends Thread { 4 private String name; 5 public MyThread(String name) { 6 this.name = name; 7 } 8 @Override 9 public void run() { 10 for (int i = 0; i < 100; i++) { 11 System.out.

java多线程常见类与方法之java.util.concurrent.locks

1.java.util.concurrent.locks包里面的主要接口Lock,Condition,ReadWriteLock,主要的类为ReentrantLock,ReentrantReadWriteLock,ReentrantReadWriteLock.ReadLock,ReentrantReadWriteLock.WriteLock,LockSupport 2.ReentrantLock里面的主要方法为:lock(),unlock(),tryLock(),lockInterruptibl