Java 之前有个api函数可以直接关闭线程, stop(), 后来, 取消了. 其替代的方式主要有两种:
1. 自己加入一个成员变量, 我们在程序的循环里面, 轮流的去检查这个变量, 变量变化时,就会退出这个线程. 代码示例如下
package com.test;
public class StopThread extends Thread {
private boolean _run = true;
public void stopThread(boolean run) {
this._run = !run;
}
@Override
public void run() {
while(_run) {
///
// 数据处理
///
}
//super.run();
}
public static void main(String[] args) {
StopThread thread = new StopThread();
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//停止线程
thread.stopThread(true);
}
}
2. 方法1 虽然可以处理好, 不过, 在有阻塞线程的语句的时候往往不能处理好. 比如, 设计到Socket的阻塞语句. 虽然java有提供异步io但是异步io是在程序里不断去查询有没有消息的, 所以耗电量可想而知, 对手机这种设备来说往往不适用.
那么阻塞的语句,怎么终止线程呢?
Java虽然deprecate了一个stop,但是,提供了interrupt(),这个方法是安全的. 这个中断方法可以将阻塞的线程唤醒过来, 但是注意 他不能将非阻塞的线程中断. 中断的同时,会抛出一个异常InterruptedException. 幸运的是, SocketChannel.connect() .read() 阻塞方法都会接受中断,ClosedByInterruptException.
这时我们不轮询变量了, 轮询当前线程是否被中断, 代码
package com.test;
public class StopThread extends Thread {
@Override
public void run() {
try {
System.out.println("start");
while(!this.isInterrupted()) {
///
//数据处理
///
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("stop");
//super.run();
}
public static void main(String[] args) {
StopThread thread = new StopThread();
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();
System.out.println("interrupt");
}
}
分享到:
相关推荐
封杀MessageBox 关闭对话框 自动关闭 Message 自动关闭Message
例如: for (int i = 0; i ; i++) { ...如何关闭其中的一个线程呢? 请下载解决方案。 呵呵,这个实例10分值的买, 觉得好的话就评个分吧,评分后会返回你11分 (一定要评分,光评论是不返分的)
C# winform 动态创建和 关闭多线程,基于VS2010的完整解决方案。 可运行
主要介绍了解决python父线程关闭后子线程不关闭问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本工程是VS2019的C++语言的,我在网上找了很多关于关闭线程的例子,都不能彻底关闭开着的线程,这个例子是个C++函数,我放到了MFC界面上,这样看着更直观,用的时候,直接把关闭线程的函数提取出来拿来用。...
javacv的推流和关闭推流,线程的开启和关闭,带摄像头
实现三个线程同时执行,且可以单独关闭和运行,通过进度条实现可视化演示。
介绍了Java线程关闭的3种方法,有需要的朋友可以参考一下
易语言正确退出线程源码,正确退出线程,多线程,正常结束线程,提示信息,发送消息
c# 多线程任务中结束全部线程
mysql查看当前执行线程_关闭当前的某些线程 show processlist_kill每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW
运行后,发现通过鼠标按主窗体的关闭按键关闭主创体后,线程不会自动终止,依然在运行。尽管对我的使用场景来说,这不是问题,因为立马就关机了。但在调试阶段就恨繁,因为后台线程很占资源。怎么能让主窗体关闭是子...
怎样干净的关闭指定线程? 向线程插入异常,通过try catch住异常就可以干净的关闭线程
Android线程结束——合理的结束你想结束的线程
(1)掌握Windows系统提供的线程创建与撤销系统调用 (2)掌握Windows系统环境下线程的创建与撤销方法 2 实验准备知识 (1)线程创建 CreateThread()完成线程的创建。它在调用进程的地址空间上创建一个线程,执行...
VC正确打开关闭一个线程,运用信号量,以前喜欢运用BOOL全局变量关闭,但老有Bug。
枚举 并且关闭 进程中的 线程的 源代码 枚举 并且关闭 进程中的 线程的 源代码 枚举 并且关闭 进程中的 线程的 源代码 枚举 并且关闭 进程中的 线程的 源代码
Qt线程有两种方法:1是继承qthread;...解决办法:无法关闭在另一个线程的定时器,是因为定时器要在新的线程中new,不要在构造函数中new出来,这样定时器才属于另一个线程,而不是创造该线程的主线程中;
进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。 线程是进程...