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 ...
随机推荐
- JavaScript的条件语句
JavaScript的条件语句 1.JavaScript的条件语句包括以下几个 (1)if - 只有当指定条件为true时,使用该语句来执行代码: (2)if...else - 当指定条件为true时 ...
- U盘安装CentOS7的最终解决方案
转载自http://www.augsky.com/599.html 终于将CentOS7装上笔记本了,过程无比艰辛,因为我发现网上大家提到的所有U盘安装CentOS7时碰到的问题几乎都被我碰到了,像什 ...
- Python3基础 if-else实例 判断输入的数字是否为8
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- SD卡驱动分析(一)
Android下的SD卡驱动与标准LINUX下的SD卡驱动好像没有太大的区别,这里就以高通的ANDROID 2.3以代表,来简要分析一下LINUX下SD卡驱动的写法.由于小弟的技术有限,分析的有错的地 ...
- 【转载】ogre内存管理
原文:ogre内存管理 OGRE内存分配策略相关文件及简述 OGRE提供了自己的内存分配策略,甚至为STL容器提供了新的分配策略,相关文件及简述如下: OgreMemoryAllocatedObjec ...
- SIP进行时
一直以“简单”著称的SIP其实也没那么简单,不过任何事物想掌握它都很困难. 这篇文档旨在不断的记录SIP使用过程中遇到的各种疑惑和问题. 一.响应422 Session Interval Too Sm ...
- Android——android学习(android目录与AndroidManifest解析)
res目录:存放android项目的各种资源文件 layout:存放界面布局文件 values:存放各种xml格式的资源文件 strings.xml:字符串资源文件: colors.xml:颜色资源文 ...
- STORM_0004_windows下zookeeper的伪集群的搭建
-----------------------------------------------------START------------------------------------------ ...
- 关于cmbiling.jar cocos2dx的问题
CMBilling.jar是移动基地的支付库,这样的配置在eclipse下能编译通过,可是用cocos compile命令却找不到这个库及相应的接口函数,移动有个特殊要求,它不允许CMBilling ...
- iOS - OC NSPoint 位置
前言 结构体,这个结构体用来表示事物的一个坐标点. typedef CGPoint NSPoint; struct CGPoint { CGFloat x; CGFloat y; }; typedef ...