中断线程 —— interrupt()

一个正在运行的线程除了正常的时间片中断之外,能否被其他线程控制?或者说其他线程能否让指定线程放弃CPU或者提前结束运行? 除了线程同步机制之外,还有两种方法: (1) Thread.stop(), Thread.suspend(), Thread.resume() 和Runtime.runFinalizersOnExit() 这些终止线程运行的方法 。这些方法已经被废弃,使用它们是极端不安全的。 (2) Thread.interrupt() 方法是很好的选择。但是使用的时候我们必须好好理解一下它的用处。

//无法中断正在运行的线程代码

class TestRunnable implements Runnable{

public void run(){

while(true)

{

System.out.println( "Thread is running..." );

long time = System.currentTimeMillis();//去系统时间的毫秒数

while((System.currentTimeMillis()-time < 1000)) {

//程序循环1秒钟,不同于sleep(1000)会阻塞进程。

}

}

}

}

public class ThreadDemo{

public static void main(String[] args){

Runnable r=new TestRunnable();

Thread th1=new Thread(r);

th1.start();

th1.interrupt();

}

}

//运行结果:一秒钟打印一次Thread is running...。程序没有终止的任何迹象

上面的代码说明interrupt()并没有中断一个正在运行的线程,或者说让一个running中的线程放弃CPU。那么interrupt到底中断什么。 首先我们看看interrupt究竟在干什么。 当我们调用th1.interrput()的时候,线程th1的中断状态(interrupted status) 会被置位。我们可以通过Thread.currentThread().isInterrupted() 来检查这个布尔型的中断状态。 在Core Java中有这样一句话:"没有任何语言方面的需求要求一个被中断的程序应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断"。好好体会这句话的含义,看看下面的代码:

//Interrupted的经典使用代码

public void run(){

try{

....

while(!Thread.currentThread().isInterrupted()&& more work to do){

// do more work;

}

}catch(InterruptedException e){

// thread was interrupted during sleep or wait

}

finally{

// cleanup, if required

}

}

很显然,在上面代码中,while循环有一个决定因素就是需要不停的检查自己的中断状态。当外部线程调用该线程的interrupt 时,使得中断状态置位。这是该线程将终止循环,不在执行循环中的do more work了。

这说明: interrupt中断的是线程的某一部分业务逻辑,前提是线程需要检查自己的中断状态(isInterrupted())。

但是当th1被阻塞的时候,比如被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞时。调用它的interrput()方法。可想而知,没有占用CPU运行的线程是不可能给自己的中断状态置位的。这就会产生一个InterruptedException异常。

//中断一个被阻塞的线程代码

class TestRunnable implements Runnable{

public void run(){

try{

Thread.sleep(1000000); //这个线程将被阻塞1000秒

}catch(InterruptedException e){

e.printStackTrace();

//do more work and return.

}

}

}

public class TestDemo2{

public static void main(String[] args) {

Runnable tr=new TestRunnable();

Thread th1=new Thread(tr);

th1.start(); //开始执行分线程

while(true){

th1.interrupt(); //中断这个分线程

}

}

}

/*运行结果:

java.lang.InterruptedException: sleep interrupted

at java.lang.Thread.sleep(Native Method)

at TestRunnable.run(TestDemo2.java:4)

at java.lang.Thread.run(Unknown Source)*/

* 如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用 * Object.wait()、ServerSocket.accept()和DatagramSocket.receive()时,他们都可能永 * 久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使 * 用某种机制使得线程更早地退出被阻塞的状态。很不幸运,不存在这样一种机制对所有的情况 * 都适用,但是,根据情况不同却可以使用特定的技术。使用Thread.interrupt()中断线程正 * 如Example1中所描述的,Thread.interrupt()方法不会中断一个正在运行的线程。这一方法 * 实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更 * 确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么, * 它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

java 线程 通过interrupted_Java线程的传说(1)——中断线程Interrupted的用处相关推荐

  1. Java基础 - 坦克大战(第四章,线程基础)

    文章目录 线程终止 基本说明 案例 线程常用方法1 细节 线程常用方法2 礼让(yield) 插队(join) 案例 线程常用方法3 用户线程和守护线程 用户线程 守护线程 常见的守护线程(垃圾回收机 ...

  2. 中断优先级和中断线程优先级

    中断是一种当今很重要的硬件与cpu通信的方式,主板上集成很多硬件,那么就可以认为会有很多中断,但是cpu的数目往往要少得多,那么肯定会有多个硬件中断竞争一个cpu的情况,任何系统(包括自然界)都不能乱 ...

  3. java结束全部操作代码_Java创建与结束线程代码示例

    这篇文章主要介绍了Java创建与结束线程代码示例,小编觉得挺不错的,这里分享给大家,供需要的朋友参考. 本文讲述了在Java中如何创建和结束线程的最基本方法,只针对于Java初学者.一些高级知识如线程 ...

  4. Java一个线程能否结束另一个永不停止的线程

    在Java中停止一个线程有三种办法 : 1.正常结束执行: 2.发生异常; 3.被其他线程stop(Java官方不建议) 参考:https://docs.oracle.com/javase/8/doc ...

  5. java线程间通信管道_通过管道进行线程间通信

    管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读数据.通过管道,实现不同线程间的通信,而无须借助类似共享变量.临时文件之 ...

  6. java 多线程 进程_Java多线程1:进程与线程概述

    进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...

  7. 每个java程序都至少有一个线程给主线程,java程序在主线程中判断各个子线程状态的操作,该如何解决...

    java程序在主线程中判断各个子线程状态的操作 每个子线程在队列为空时会wait等待其他线程添加新url到队列,到最后所有子线程都取不到url时也会都wait住,要在主线程中判断如果所有的子线程都是w ...

  8. Java多线程笔记(零):进程、线程与通用概念

    前言 不积跬步,无以至千里:不积小流,无以成江海.在学习Java多线程相关的知识前,我们首先需要去了解一点操作系统的进程.线程以及相关的基础概念. 进程 通常,我们把一个程序的执行称为一个进程.反过来 ...

  9. Java中的“可运行的实现”与“扩展线程”

    从什么时候开始在Java中使用线程开始,我发现了以下两种编写线程的方法: 与implements Runnable : public class MyRunnable implements Runna ...

最新文章

  1. 常纪文:智慧城市有助于实现低碳绿色发展
  2. 制表符补全位数在idea和eclipse中的区别
  3. 一个典型的SAP Commerce extension目录结构
  4. 如何把VS Code打造成Java开发IDE?
  5. 通讯录管理系统课设使用c编写基于链表增查删改分组文本操作随程序实时同步
  6. 力扣501. 二叉搜索树中的众数(JavaScript)
  7. spring 获取postman上传的二进制文件
  8. 网络爬虫(2)--异常处理
  9. Latex入门----从提纲开始
  10. 用c语言输入年份 月份 显示天数,java输入月份,年份,显示对应月份的天数,...
  11. postgresql:operator does not exist: text[] character varying[]
  12. 做直播能有多赚钱,Python告诉你
  13. Unity视频播放的脚本控制
  14. 计算机机房线槽,机房机柜布置 机房整改之布线篇~
  15. Paxos太难懂?五张图读懂Paxos协议
  16. JavaScript之DOM对象
  17. PAT 乙级 1046(划拳)
  18. selenium+requests实现自动连接校园网并验证!
  19. HCIP第十五天笔记
  20. sanic 笔记 (概览)

热门文章

  1. LeetCode中等题之最优除法
  2. PyTorch全连接ReLU网络
  3. 实时双频Wi-Fi如何实现下一代车内连接
  4. 使用码云给同事地址地址注意事项
  5. mybatis中![CDATA[]]的作用
  6. render函数和redirect函数的区别+反向解析
  7. Go 学习笔记(27)— type 关键字(类型定义、类型别名、类型查询、定义接口、定义结构体)
  8. docker load 出错 open /var/lib/docker/tmp/docker-import-837327978/bin/json: no such file or directory
  9. hdu 2156 分数矩阵
  10. Servlet运行原理以及生命周期