Future接口的cancel方法 无法正常取消正在执行的线程
2016-11-28 15:11
911 查看
最近想记录一下,如何优雅的中断线程任务的方法。概括的说,有3种方法:
1、通过thread.interrupt,当然这需要你线程任务类里,自己写"是否中断"的判断逻辑
2、通过Future的cancel方法来实现,这也是我们这里要测试的
3、通过Thead的实例方法stop来中断线程,当然因为粗暴和不安全已经被废弃
想的很好,也是我想用代码实现一下,于是发现了一个问题,就是实用方法2取消线程时,必须要在任务类的run方法中使用Thread.sleep(),不然不会被中断。废话不说,上代码:
只要加上Thread.sleep(),之后,就可以中断。不理解其中的道理。
看了Future, future.cancel()可以删除同步阻塞任务这个帖子后,我恍然大悟,我的任务类里写了while(true),这样的线程只有thead.stop能中断,其他的方式只是改变中断状态标志,所以要改为
这样就可以中断了。
1、通过thread.interrupt,当然这需要你线程任务类里,自己写"是否中断"的判断逻辑
2、通过Future的cancel方法来实现,这也是我们这里要测试的
3、通过Thead的实例方法stop来中断线程,当然因为粗暴和不安全已经被废弃
想的很好,也是我想用代码实现一下,于是发现了一个问题,就是实用方法2取消线程时,必须要在任务类的run方法中使用Thread.sleep(),不然不会被中断。废话不说,上代码:
package com.nipin.datastructor; import java.util.Random; import java.util.concurrent.*; /** * Created by nipin on 16/11/28. * 学习如何优雅的停止一个正在执行的线程 * 主要思路: * 1、通过thread.interrupt,当然这需要你线程任务类里,自己写"是否中断"的判断逻辑 * 2、通过Future的cancel方法来实现,这也是我们这里要测试的 * 3、通过Thead的实例方法stop来中断线程,当然因为粗暴和不安全已经被废弃 */ public class ThreadCancelDemo { public static void main(String[] args) { //方法1 /* Thread thread = new Thread(){ @Override public void run() { super.run(); while (!isInterrupted()){ try { Thread.sleep(100l); System.out.println(Thread.currentThread().getName()+" print random :"+ new Random().nextInt()); } catch (InterruptedException e) { e.printStackTrace(); } } } }; thread.start(); Thread.sleep(1000l); thread.interrupt(); */ //方法2 ExecutorService executorService = Executors.newFixedThreadPool(10); Runnable runnable = new Runnable() { @Override public void run() { while (true){ System.out.println(Thread.currentThread().getName()+" print random --> :"+ new Random().nextInt()); } } }; try { Future<?> submit = executorService.submit(runnable); Thread.sleep(100l); boolean cancel = submit.cancel(true); System.out.println("是否已经取消"+cancel); executorService.shutdown(); } catch (InterruptedException e) { e.printStackTrace(); } } }
只要加上Thread.sleep(),之后,就可以中断。不理解其中的道理。
看了Future, future.cancel()可以删除同步阻塞任务这个帖子后,我恍然大悟,我的任务类里写了while(true),这样的线程只有thead.stop能中断,其他的方式只是改变中断状态标志,所以要改为
public void run() { while (!Thread.currentThread().isInterrupted()){ System.out.println(Thread.currentThread().getName()+" print random --> :"+ new Random().nextInt()); }
这样就可以中断了。
相关文章推荐
- 关于虚拟机复制文件时:无法确定本地文件类型。您可能没有执行此操作的权限。 正在取消文件复制操作。的决解方法
- 取消线程接口pthread_cancel吐槽
- 因为应用程序正在发送一个输入同步呼叫,所以无法执行传出的呼叫 -- 解决方法
- 31.ios 防止按钮快速点击造成多次响应的避免方法。 取消正在执行中的方法
- linux下pthread_cancel无法取消线程的原因【转】
- linux下pthread_cancel无法取消线程的原因
- java自定义任务类定时执行任务示例 callable和future接口使用方法
- WebView中调用assets下的js脚本无法正常执行的解决方法
- 因为应用程序正在发送一个输入同步呼叫,所以无法执行传出的呼叫 -- 解决方法【转】
- linux下pthread_cancel无法取消线程的原因
- 任何回调方法都无法正常执行,感觉自己已不会写代码了
- 重启IIS提示"不支持此接口"这个错误,无法正常重启的解决方法
- yield方法(暂停当前正在执行的线程对象,并执行其他线程。 )
- FutureTask的cancel方法真的能停止掉一个正在执行的异步任务吗
- 任何回调方法都无法正常执行,感觉自己已不会写代码了
- NSObject 取消执行延时方法cancelPreviousPerformRequestsWithTarget:
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- java自定义任务类定时执行任务示例 callable和future接口使用方法
- 通过Future来取消正在执行的任务
- 关于在子线程中在run方法执行完之后通知主线程进行操作的方法。(Toast在子线程中无法使用)