android 多线程future,多线程FutureTask的使用方法和使用实例

FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。

Future有个get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。

FutureTask有下面几个重要的方法:

1.get()

阻塞一直等待执行完成拿到结果

2.get(int timeout, TimeUnit timeUnit)

阻塞一直等待执行完成拿到结果,如果在超时时间内,没有拿到抛出异常

3.isCancelled()

是否被取消

4.isDone()

是否已经完成

5.cancel(boolean mayInterruptIfRunning)

试图取消正在执行的任务

用ThreadPoolExecutor和FutureTask实现可取消任务线程池

private Map> tasks = new HashMap>();

// 构造一个线程

private ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, newLinkedBlockingQueue());

/**

* @param tasksList

*/

public void addTaskList(List> tasksList) {

for (Callable t : tasksList) {

FutureTask futureTask = new FutureTask(t);

executor.execute(futureTask);

String key = Long.toHexString(System.nanoTime());

tasks.put(key, futureTask);

}

}

/**

* @param task

* @return

*/

public String addTask(Callable task) {

FutureTask futureTask = new FutureTask(task);

executor.execute(futureTask);

String key = Long.toHexString(System.nanoTime());

tasks.put(key, futureTask);

return key;

}

/**

* @param task

* @return

*/

public String addDBTask(Callable task) {

FutureTask futureTask = new FutureTask(task) {

public boolean cancel(boolean mayInterruptIfRunning) {

System.out.println("Roll Back and Closs Session");

return super.cancel(mayInterruptIfRunning);

}

};

executor.execute(futureTask);

String key = Long.toHexString(System.nanoTime());

tasks.put(key, futureTask);

return key;

}

/**

* @param key

* @return

*/

public boolean taskIsDone(String key) {

FutureTask futureTask = tasks.get(key);

if (futureTask != null) {

return futureTask.isDone();

}

return false;

}

/**

* @param key

* @return

*/

public boolean taskIsCancelled(String key) {

FutureTask futureTask = tasks.get(key);

if (futureTask != null) {

return futureTask.isCancelled();

}

return false;

}

/**

* @param key

* @return

*/

public String getTaskResult(String key) {

FutureTask futureTask = tasks.get(key);

if (futureTask.isDone()) {

try {

String result = futureTask.get();

tasks.remove(key);

return result;

} catch (InterruptedException e) {

e.printStackTrace();

return null;

} catch (ExecutionException e) {

e.printStackTrace();

return null;

}

} else {

return null;

}

}

/**

* @param task

* @return

*/

public String addTaskAndWaitResult(Callable task) {

FutureTask futureTask = new FutureTask(task);

executor.execute(futureTask);

String key = Long.toHexString(System.nanoTime());

tasks.put(key, futureTask);

try {

return futureTask.get();

} catch (InterruptedException e) {

e.printStackTrace();

return null;

} catch (ExecutionException e) {

e.printStackTrace();

return null;

}

}

/**

*

*/

public void removeAllTask() {

for (String key : tasks.keySet()) {

executor.remove((Runnable) tasks.get(key));

tasks.remove(key);

}

}

/**

* @param key

*/

public void removeQueryTask(String key) {

executor.remove((Runnable) tasks.get(key));

}

/**

* @param key

*/

public void removeTask(String key) {

tasks.remove(key);

}

/**

*

*/

public void clearTaskList() {

tasks.clear();

}

public synchronized void stop(){

try {

executor.shutdownNow();

executor.awaitTermination(1L, TimeUnit.MILLISECONDS);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

executor = null;

tasks.clear();

tasks = null;

}

}

/**

* @param key

*/

public void cancelTask(String key) {

FutureTask futureTask = tasks.get(key);

if (futureTask != null) {

if (!futureTask.isDone()) {

futureTask.cancel(true);

}

}

}

public void purgeCancelTask() {

executor.purge();

executor.getQueue();

}

/**

* @param args

*/

public static void main(String[] args) {

ImageSearchThreadPool exec = new ImageSearchThreadPool();

ArrayList keyList = new ArrayList();

ArrayList removeKeyList = new ArrayList();

ArrayList cancelKeyList = new ArrayList();

for (int i = 0; i

// 产生一个任务,并将其加入到线程池

String task = "task@ " + (i + 1);

System.out.println("put " + task);

keyList.add(exec.addDBTask(new DBTask(task)));

}

try {

Thread.sleep(1L);

} catch (InterruptedException e) {

e.printStackTrace();

}

for (int i = 0; i

if (exec.taskIsDone(keyList.get(i))) {

System.out.println(exec.getTaskResult(keyList.get(i)));

exec.removeTask(keyList.get(i));

removeKeyList.add(keyList.get(i));

} else {

exec.cancelTask(keyList.get(i));

System.out.println("Cancel task: " + (i + 1));

exec.removeTask(keyList.get(i));

cancelKeyList.add(keyList.get(i));

}

}

exec.purgeCancelTask();

exec.stop();

try {

Thread.sleep(6000L);

} catch (InterruptedException e) {

e.printStackTrace();

}

for (String key : cancelKeyList) {

if (exec.taskIsCancelled(key)) {

System.out.println("Cancel: " + key);

}

}

for (int i = 0; i

keyList.get(i);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2017.12.26

转载于:https://www.cnblogs.com/dyh-air/p/8118961.html

mac 下安装pip

pip是常用的python包管理工具,类似于java的maven。用python的同学,都离不开pip。 在新mac中想用home-brew安装pip时,遇到了一些小问题: bogon:~ wanglei$ brew install pip Error: No available formula with the name "pip&…

IT职场人生系列

IT职场人生系列之一:序言及找谁占卜 本文是IT职场人生系列的第一篇。 时间流逝,渐渐从之前在公司里边的小弟变成大哥了,当年身边比我大的程序员们都不见了,既没有当领导也没有去创业,就这么消失了。 年轻的程序员或…

RS-232协议

计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。 在串行通讯时,要求通讯双方都采用一个标准接口&am…

linux sed 找出前后三行,Linux Sed 使用示例

环境:CentOS鉴于语句描述苍白无力,用例子直接说明。mytxt文件内容:zilzhang 19881110 jiangxi 18 filmzhagnsan 21321 sichuan 100 cardlisi 3435 hunan 65 TV1. 找出文件第二行$ sed -n ‘2p‘ mytxtzhagnsan 21321 sichua…

MessageBox 弹框

模拟系统的消息提示框而实现的一套模态对话框组件,用于消息提示、确认消息和提交内容。 从场景上说,MessageBox 的作用是美化系统自带的 alert、confirm 和 prompt,因此适合展示较为简单的内容。如果需要弹出较为复杂的内容,请使用…

什么是同轴电缆

同轴电缆从用途上分可分为基带同轴电缆和宽带同轴电缆(即网络同轴电缆和视频同轴电缆)。同轴电缆分50Ω 基带电缆和75Ω宽带电缆两类。基带电缆又分细同轴电缆和粗同轴电缆。基带电缆仅仅用于数字传输,数据率可达10Mbps。同轴电缆(Coaxial Ca…

android textview表情,Android开发(16)-TextView显示表情图像和文字

从这个案例中我们可以学到当我们美化图片美化界面的时候可以在某一区域输入图片和文字混搭信息,第三张图片按比例缩小,第四张图像有超链接布局文件MainActivity.javapackage com.example.textview3;import java.lang.reflect.Field;import android.os.Bundle;import…

Rating

题目链接 题意: 起始状态是(0。0),每次转移的时候都是对两个数中的较小的数操作。1)以概率p转向(min(a 50,1000)。b) 2)以概率1-p转向&#x…

linux的apache2.4限定某个目录禁止解析PHP及user_agent与PHP相关配置

限定某个目录禁止解析PHP 对于使用PHP语言编写的网站,有一些目录是有需求上传文件的,比如服务器可以上传图片,并且没有做防盗链,所以就会被人家当成了一个图片存储服务器,并且盗用带宽流量。如果网站代码有漏洞&#x…

什么是光缆

光缆(optical fiber cable)是为了满足光学、机械或环境的性能规范而制造的,它是利用置于包复护套中的一根或多根光纤作为传输媒质并可以单独或成组使用的通信线缆组件。光缆主要是由光导纤维(细如头发的玻璃丝)和塑料保护套管及塑料外皮构成&…

js调用android播放器,js调用android本地方法

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?昨天自己录了一个android本地调用h5中js方法,可能是因为视频比较耗费流量,结果看的人不是很多,所以决定还是先写文章&#xff0…

linux之分区的水深(标准分区方式)

1.首先创建boot分区(200M即可) boot分区作为linux启动相关信息的存储介质,不论boot分区什么时候,它都会排在整个硬盘的起始段,方便系统启动获取相关信息,用户尽量不去更改boot分区的挂载点顺序。 2.接着创建swap分区(应…

doxygen相关问题

doxygen相关问题 我主要的设置有 现在 wizard对话框中大体设置下,然后 export设置: project->DOXYFILE_ENCODINGGBK project->OUTPUT_LANGUAGEchinese input->INPUT_ENCODINGGBK Dot->HAVE_DOT Dot-> UML_LOOK Dot->CALL_GRAPH Dot->CALLER_GRAPH http…

前端之JavaScript 02

一、函数 // 最基础的函数定义 function f1() {console.log(hello world!); } f1(); // hello world!// 带参数的函数 function f2(name,age) {console.log("姓名 : " name " 年龄:" age); } f2("jassin",18); // 姓名 : jassi…

什么是双绞线

双绞线(twisted pair,TP)是一种综合布线工程中最常用的传输介质,是由两根具有绝缘保护层的铜导线组成的。把两根绝缘的铜导线按一定密度互相绞在一起,每一根导线在传输中辐射出来的电波会被另一根线上发出的电波抵消&a…

Android蒙版倒计时,【倒计时海报设计】- 虎课网

我们在大街上经常会看到各种宣传海报,有时商家为了达到促销的目的会在醒目的地方张贴一张倒计时海报,为的就是吸引群众的眼睛,大家了解PS倒计时海报设计的制作过程吗?如果对这方面操作不太了解的话,大家可以关注一下下…

linkit-smart-7688-feed 安装笔录

转载于:https://www.cnblogs.com/orangezs/p/8571791.html

前端性能优化之性能测试

前端性能优化是一个很宽泛的概念,有很多教程都有前端性能优化的方法,这也是我们一直在关注的一件重要事情。配合各种方式、手段、辅助系统,前端优化的最终目的都是提升用户体验,改善页面性能,我们常常竭尽全力进行前端…

模拟传输和数字传输的优缺点

与模拟数据通信相比较,数字数据通信具有下列优点: a. 来自声音、视频和其他数据源的各类数据均可统一为数字信号的形式,并通过数字通信系统传输 b. 以数据帧为单位传输数据,并通过检错编码和重发数据帧来发现与纠正通信错误&am…