【java并发编程实战】第七章:取消与关闭
2024-08-23 20:58:19
停止线程的几种方式
一般的逻辑停止
public class ThreadInterruptTest {
public static volatile boolean cancel = true;
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(
new Runnable() {
@Override
public void run() {
while (cancel) {
System.out.println("still alive");
}
}
}
);
thread.start();
Thread.sleep(1000L);
cancel = false;
}
}
注意:上面的代码如果在线程的运行逻辑中有调用阻塞的方法,比如arrayBlockQueue的put操作,就会一直等待插入,直到队列有空位位置。就会导致cancel的判断永远不会执行。所以可以采用中断的方式
中断
采用interrupt()。对线程设置为中断标志。设置后不会立刻终端线程,而是待调用严格检查异常interruptException的时候就会停止,比如await,sleep等。
通常,interrupt是中断线程的最佳方式
通过future来取消
Future.cancle(boolean), true:任务正在当前线程执行,可以终端。false:如果任务还未执行,就不要运行。
注意:在调用了cancel方法后,再调用isDone将永远返回true
对于处理不可中断的阻塞
对于不能响应中断interruptException的阻塞。interrupt方法只能标志位可中断,但是无任何其他的作用。对于这些阻塞的中断 ,我们应该查找阻塞的原因,然后重写interrupt的方法来中断。
- 1.java.io的socket io操作:常见的阻塞在于套接字的读取和写入。虽然inputstream和outputstream不会响应中断,但是可以通过关闭底层套接字的方式。是的read和write抛出socketexception。
- 2.java同步io
- 3.java异步io
- 4.显示锁的Lock.lockinterruptibly.
// 待续
最新文章
- write/wall 1
- Javascript操作Cookie的脚本 — CookieHelper
- SAP ECC MM 配置文档
- JavaWeb之Servlet:Cookie 和 Session
- Serv-u FTP服务器
- 安装php时,make步骤报错make: *** [ext/gd/gd.lo] Error 1
- ios 添加多个target 管理 多个版本文件
- iOS 设置#ffff 这种颜色
- 如何将nupkg文件安装到VS2017
- 使用Interlocked在多线程下进行原子操作,无锁无阻塞的实现线程运行状态判断
- tomcat停止和启动脚本
- seq2seq和attention应用到文档自动摘要
- > Raiders 项目配置
- Oracle存储过程基础
- spingboot @EnableScheduling
- [Go] 单元测试/性能测试 (go test)
- xmpp实现的即时通讯聊天(一)
- How to Restore “TrustedInstaller” as Default Owner of a File
- JavaScript ,Css and Jquery In OpenERP 7.0
- 转载 MYSQL性能优化的最佳20+条经验