停止线程的几种方式

一般的逻辑停止
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.

// 待续

最新文章

  1. write/wall 1
  2. Javascript操作Cookie的脚本 — CookieHelper
  3. SAP ECC MM 配置文档
  4. JavaWeb之Servlet:Cookie 和 Session
  5. Serv-u FTP服务器
  6. 安装php时,make步骤报错make: *** [ext/gd/gd.lo] Error 1
  7. ios 添加多个target 管理 多个版本文件
  8. iOS 设置#ffff 这种颜色
  9. 如何将nupkg文件安装到VS2017
  10. 使用Interlocked在多线程下进行原子操作,无锁无阻塞的实现线程运行状态判断
  11. tomcat停止和启动脚本
  12. seq2seq和attention应用到文档自动摘要
  13. > Raiders 项目配置
  14. Oracle存储过程基础
  15. spingboot @EnableScheduling
  16. [Go] 单元测试/性能测试 (go test)
  17. xmpp实现的即时通讯聊天(一)
  18. How to Restore “TrustedInstaller” as Default Owner of a File
  19. JavaScript ,Css and Jquery In OpenERP 7.0
  20. 转载 MYSQL性能优化的最佳20+条经验

热门文章

  1. Django学习之ORM操作
  2. Maven Dependencies missing jar 解决
  3. servlet三种方式实现servlet接口
  4. SuperSocket 学习
  5. rest_framework--序列化组件
  6. Emmet插件使用
  7. vue服务端渲染添加缓存
  8. 揭开js之constructor属性的神秘面纱
  9. 在Vue项目里面使用d3.js
  10. sencha inspector(调试工具)