java线程中断和终止线程运行
ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止。但有时需要在任务正在运行时取消他们,使得线程快速结束。对此Java并没有提供任何机制。但是我们可以通过Java提供的线程中断机制来实现。
首先来看Thread类三个和中断有关的方法:
public class Thread {
// 发出一个中断请求,把标志位设定为中断状态,不会终止线程运行。
// 其他线程试图调用该方法,会检测是否有权限中断该线程(正常情况
// 下不会存在权限问题,这里可以忽略)
public void interrupt() { ... }
// 检测标志位是否为中断的状态
public boolean isInterrupted() { ... }
// 清除当前线程的标志位的中断状态,返回是否为中断状态
public static boolean interrupted() { ... }
...
}
既然线程中断不会终止线程的运行,那么如何通过线程中断来实现终止线程运行呢?
我们知道一些阻塞线程的方法会抛出InterruptedException表示线程中断发生,在这种情况下就可以使用线程中断来终止线程的运行:
public class TestInterrupt {
public static void main(String[] args)
{
BlockingQueue<Object> ObjectQueue = new LinkedBlockingQueue<Object>();
Consumer consumer = new Consumer(ObjectQueue);
Thread t = new Thread(consumer);
t.start();
// 等待线程的启动
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
// 中断线程
t.interrupt();
}
}
class Consumer implements Runnable
{
private final BlockingQueue<Object> ObjectQueue;
public Consumer(BlockingQueue<Object> ObjectQueue)
{
if (ObjectQueue == null)
{
throw new IllegalArgumentException("messageQueue cannot be null");
}
this.ObjectQueue = ObjectQueue;
}
@Override
public void run()
{
boolean isRunning = true;
while (isRunning)
{
try
{
// take方法阻塞时会因为线程中断抛出中断异常
System.out.println(ObjectQueue.take());
}
catch (InterruptedException e)
{
// 一旦抛出中断异常,线程的中断状态就会被清除,这个时候调用
// Thread的isInterrupted()方法返回的是false
isRunning = false;
System.out.println("Cancelled");
}
}
}
}
很多任务执行的服务程序的逻辑和上面的例子很类似,都可以使用这种方法来终止线程的运行。
java线程中断和终止线程运行的更多相关文章
- 《Java并发编程》之线程中断与终止线程运行
Java中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线 ...
- 【java】 java 中stop方法终止线程的不良后果
stop()方法属于暴力终止线程的方法,有诸多隐患已经被废弃了. 下面演示的是stop方法会释放锁,造成数据不一致的问题. package com.xwolf.java.thread; /** * C ...
- Java 如何中断和恢复线程的执行
一.线程的状态 线程可以阻塞于四种状态: 1.当线程执行Thread.sleep()时,它一直阻塞到指定的毫秒时间之后,或者阻塞被另一个线程打断: 2.当线程碰到一条wait()语句时,它会一直阻塞到 ...
- Java关闭Socket来终止线程
Java代码: package Threads; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...
- java 线程的终止与线程中断
关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结 ...
- Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- 【Java 语言】Java 多线程 一 ( 线程启动 | 线程中断 )
一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...
- Java基础之多线程篇(线程创建与终止、互斥、通信、本地变量)
线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...
随机推荐
- java实现多线程断点续传,上传下载
采用apache 的 commons-net-ftp-ftpclient import java.io.File; import java.io.FileOutputStream; import ja ...
- Redis安装及配置(Linux)
ubuntu 16.04安装redis-server apt-get install redis-server 启动.停止.重启.重新加载.查看状态 /etc/init.d/redis-server ...
- [转]NSTimer和CADisplayLink的基本用法
简要区别:NSTimer初始化器接受调用方法逻辑之间的间隔作为它的其中一个参数,预设一秒执行30次.CADisplayLink默认每秒运行60次,通过它的frameInterval属性改变每秒运行帧数 ...
- Linux TOP命令详解
先来看一下执行以后的结果: 各项数值的含义如下: 第一行是任务队列信息. :: 当前时间 up days,: 系统运行时间,格式为天,时:分 user 当前登录用户数 load average: 0. ...
- Java代码规范性
---------------------------------------------------------------------------------------------------- ...
- poj 3304线段与直线相交
http://poj.org/problem?id=3304 Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: ...
- Python入门-引号
Python 接收单引号(' ),双引号(" ),三引号(''' """) 来表示字符串,引号的开始与结束必须的相同类型的. 其中三引号可以由多行组成,编写多行 ...
- HDU 2222 Keywords Search(查询关键字)
HDU 2222 Keywords Search(查询关键字) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- jQuery EasyUI DataGrid API 中文文档
扩展自$.fn.panel.defaults,用 $.fn.datagrid.defaults重写了 defaults . 依赖 panel resizable linkbutton pagi ...
- Java初始化(构造器)
在类的内部,变量定义的先后顺序决定了初始化的顺序.即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化. import static humeng.com.cnblo ...