专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 行业应用

多线程FutureTask的使用方法跟使用实例

发布时间:2010-06-06 18:55:45 文章来源:www.iduyao.cn 采编人员:星星草
多线程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实现可取消任务线程池

http://jlusdy.iteye.com/blog/476667

private Map<String, FutureTask<String>> tasks = new HashMap<String, FutureTask<String>>();

// 构造一个线程

private ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());

 

/**

* @param tasksList

*/

public void addTaskList(List<Callable<String>> tasksList) {

for (Callable<String> t : tasksList) {

FutureTask<String> futureTask = new FutureTask<String>(t);

executor.execute(futureTask);

 

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

tasks.put(key, futureTask);

}

}

 

/**

* @param task

* @return

*/

public String addTask(Callable<String> task) {

FutureTask<String> futureTask = new FutureTask<String>(task);

executor.execute(futureTask);

 

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

tasks.put(key, futureTask);

return key;

}

 

/**

* @param task

* @return

*/

public String addDBTask(Callable<String> task) {

FutureTask<String> futureTask = new FutureTask<String>(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<String> futureTask = tasks.get(key);

if (futureTask != null) {

return futureTask.isDone();

}

return false;

}

 

/**

* @param key

* @return

*/

public boolean taskIsCancelled(String key) {

FutureTask<String> futureTask = tasks.get(key);

if (futureTask != null) {

return futureTask.isCancelled();

}

return false;

}

 

/**

* @param key

* @return

*/

public String getTaskResult(String key) {

FutureTask<String> 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<String> task) {

FutureTask<String> futureTask = new FutureTask<String>(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<String> 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<String> keyList = new ArrayList<String>();

ArrayList<String> removeKeyList = new ArrayList<String>();

ArrayList<String> cancelKeyList = new ArrayList<String>();

 

for (int i = 0; i < 10; 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 < 10; 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 < 10; i++) {

keyList.get(i);

}

}

 

线程池学习:http://www.cnblogs.com/jersey/archive/2011/03/30/2000231.html

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • 《松本行弘的程序全世界》之面向对象

    《松本行弘的程序世界》之面向对象 最近读《SICP》把脑细胞搞死大半,还没看完2章,而且看得也是一知半解,实在是受不了了,...

  • GroovyHelp 3.2.7 GA公布

    GroovyHelp 3.2.7 GA发布 GroovyHelp简介   GroovyHelp是一款Javadoc及Groovydoc搜索查阅软件,它能够帮助Java开发人员以...

  • Velocity在Roller中的使用

    Velocity在Roller中的应用 Velocity是java世界中出现比较早,也比较成熟的、性能比较好的、应用也比较广泛的模板框架。   所...

  • Rpc远程调用框架的设计与兑现(2)

    Rpc远程调用框架的设计与实现(2) 接上: 3   基于Json的前后端数据交互 3.1   轻量级的数据交换形式 3.1.1    什么是Jso...

  • excel 单元格的锁定 以及 JXL的兑现方式

    excel 单元格的锁定 以及 JXL的实现方式 在使用excel表格时,有些列是不希望用户可以修改的,诸如审计日志里面确定的部分,而审计...

  • 仓秤跟散料秤:java连接opc Server

    仓秤和散料秤:java连接opc Server 这三篇都是之前写好的,一直没发。 这次一起发出来吧。   java连接硬件很痛苦,特别是对我这...

  • Rpc远程调用框架的设计与兑现(1)

    Rpc远程调用框架的设计与实现(1) Rpc远程调用框架的设计与实现 1     Rpc远程调用框架设计概述 1.1   研究背景 1.1.1...

  • 集合中的线程安全有关问题

    集合中的线程安全问题 一、why? Java中常用的集合框架推荐使用的三个实现:HashSet\ArrayList\HashMap都是线程不安全的.如...

  • Java定时任务的兑现

    Java定时任务的实现 本例依据Java自身提供的接口实现,通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task)。 MyListener: ...

  • java中log日记的使用

    java中log日志的使用 一、介绍  Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控...

热门推荐: