线程的interrupt()
官网解释
If this thread is blocked in an invocation of the
wait()
,wait(long)
, orwait(long, int)
methods of theObject
class, or of thejoin()
,join(long)
,join(long, int)
,sleep(long)
, orsleep(long, int)
, methods of this class, then its interrupt status will be cleared and it will receive anInterruptedException
.
意思是当线程被blocked的时候可以被打断,wait()、sleep()、join()时被打断会抛出InterruptedException异常。
演示sleep()被打断
Thread t1 = new Thread() {
@Override
public void run() {
while (true) {
System.out.println("running...");
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}; t1.start();
Thread.sleep(100L);
System.out.println(t1.isInterrupted());
t1.interrupt();
System.out.println(t1.isInterrupted());
在sleep()被打断在异常中要执行break;打断循环,否则该循环一直在执行
演示wait()被打断
package com.dwz.concurrency.chapter6; public class ThreadInterrupt {
private static final Object MONITOR = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t2 = new Thread() {
@Override
public void run() {
while (true) {
System.out.println("running...");
synchronized (MONITOR) {
try {
MONITOR.wait(100L);
} catch (InterruptedException e) {
System.out.println("收到打断信号。。。");
e.printStackTrace();
break;
}
}
}
}
}; t2.start();
Thread.sleep(100L);
System.out.println(t2.isInterrupted());
t2.interrupt();
System.out.println(t2.isInterrupted());
}
}
1.跟sleep()一样,wait()被打断时在异常中要执行break;打断循环,否则该循环一直在执行
2.wait()的调用者一定是一个对象
演示join()被打断
package com.dwz.concurrency.chapter6; public class ThreadInterrupt3 {
public static void main(String[] args) throws InterruptedException {
Thread main = Thread.currentThread();
Thread t1 = new Thread() {
@Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName());
System.err.println(Thread.currentThread().isInterrupted());
}
}
}; t1.start(); System.out.println("main: " + main.getName());
Thread t2 = new Thread() {
@Override
public void run() {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2: " + Thread.currentThread().getName());
main.interrupt();
System.out.println("interrupt...");
}
};
t2.start(); try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
1.我们要清楚,join的对象是main线程,要想打断 t1.join(), 要在另一个线程中执行 main.interrupt()
2.isInterrupted()表示线程是否被打断,如果只执行 main.interrupt() 方法,意味着 t1.join()被打断
3. t1.join() 一定要在 t1.start() 和 t2.start() 之后被执行。
线程的interrupt()的更多相关文章
- Java 并发:线程中断-interrupt
一直以为执行了interrupt方法就可以让线程结束,并抛出InterruptedException. 今天看了Java并发编程实战的第七章发现并不是这么回事,在这章的开头就提到 要使任务和线程能安全 ...
- java线程的interrupt方法
java现成的interrupt方法比较容易误导新手,它其实是不会中断(停止)当前的线程,只是标志一下当前线程的某个状态值(中断标志位),并且这个状态为只对阻塞方法(比如说: ...
- 线程的Interrupt方法与InterruptedException解析
线程阻塞状态与等待状态(当一个线程处于被阻塞或等待状态时,它暂时不活动,不允许任何代码且消耗最少的资源) 当一个线程试图获得一个内部的对象锁(而不是java.util.concurrent库中的锁), ...
- 线程中断 interrupt 和 LockSupport
本文章将要介绍的内容有以下几点,读者朋友也可先自行思考一下相关问题: 线程中断 interrupt 方法怎么理解,意思就是线程中断了吗?那当前线程还能继续执行吗? 判断线程是否中断的方法有几个,它们之 ...
- 日积月累--线程中断interrupt()方法
线程中断方法interrupt()方法的理解: interrupt()方法的源码: interrupted()方法的源码及注解: isInterrupted()方法源码及注解: 在了解这个方法之前我们 ...
- 【杂谈】线程中断——Interrupt
前言 以前有一个错误的认识,以为中断操作都会抛出异常,后来才发现并不是这样,所以今天就来做一个关于中断的总结. 如何关闭线程 已被弃用的Stop方法 早期,Thread类中有一个stop方法,用于强行 ...
- Java线程停止interrupt()方法
程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程. 中 ...
- java线程中断[interrupt()函数] (转载)
一个正常的线程中断: 从运行到真正的结束,应该有三个阶段: 正常运行. 处理结束前的工作,也就是准备结束. 结束退出. Java曾经提供过抢占式限制中断,但问题多多,例如的Thread.stop.另一 ...
- java之线程中断——interrupt
如下图所示,interrupt()方法并没有成功的中断我们的线程. 为了便于理解,其实可以这样来类比(注意,只是类比,实际情况并不完全是这样):Thread类中有一个boolean的标志域用来表示线程 ...
随机推荐
- 怎样使用yum安装nginx
yum install -y nginx 以上.
- C# Extension Methods(C#类方法扩展)
使用Extension methods 可以在已有的类型(types)中添加方法(Methods),而无需通过增加一种新的类型或修改已有的类型. 比如说,想要给string类型增加一个PrintStr ...
- SQLSERVER 在PROCEDURE 中动态执行SQL语句【EXEC】并获取
1.直接上代码 CREATE PROCEDURE [dbo].[TEST] AS BEGIN DECLARE )='N8-4F', --構建SQL需要的條件 ),--構建後的SQL語句 @cnt in ...
- js摄像头
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- 爬虫遇到IP访问频率限制的解决方案
背景: 大多数情况下,我们遇到的是访问频率限制.如果你访问太快了,网站就会认为你不是一个人.这种情况下需要设定好频率的阈值,否则有可能误伤.如果大家考过托福,或者在12306上面买过火车票,你应该会有 ...
- LeetCode:627.交换工资
题目链接:https://leetcode-cn.com/problems/swap-salary/ 题目 给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值.交换所有的 ...
- ESP8266开发环境、编译、烧录
官方地址 中:http://www.espressif.com/zh-hans/support/download/overview?keys=&field_type_tid[]=14 英:ht ...
- jq国际化i18n
1.(main.js或)ajax.js引入文件 import './jquery.i18n.properties.min' //https://github.com/jquery-i18n-prope ...
- 关于postgres数据库部署之后,发现不能被外机连接解决办法
数据库 部署完毕之后,用其他机器的navcat连接发现不能连接,如下报错信息 于是在数据库服务器上查询是否启动正常,端口是否正常,发现都没有问题,由于之前也遇到了mysql部署之后,不能被其他机器访问 ...
- python错误大全
1.NameError:name 'Ture' is not defined 这个是名字没有定义,也可能写错了 while True: 2.IndentationError: unindent doe ...