您的位置:首页 > 编程语言 > Java开发

paip.java 多线程参数以及返回值Future FutureTask 的使用.

2013-12-11 12:35 459 查看
paip.java 多线程参数以及返回值Future FutureTask 的使用.

在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。

所以run的返回值是void类型。

作者Attilax 艾龙, EMAIL:1466519819@qq.com

来源:attilax的专栏

地址:http://blog.csdn.net/attilax

如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。

但后者需要前者的结果,就需要用callable接口了。

callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。

线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。

这时候,Future就出场了。Futrue可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直接call方法结束返回结果。

FutureTask类是Future 的一个实现,并实现了Runnable,所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行。如果在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。

Executor框架利用FutureTask来完成异步任务,并可以用来进行任何潜在的耗时的计算。一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。

以下是单个FUture...多个能行配合线程池以及list,参考.java Future用法和意义一句话击破_archlinux吧_百度贴吧

// ExecutorService executor = Executors.newSingleThreadExecutor();

//如果不需要特定的结果,则考虑使用下列形式的构造:Future<?> f = new FutureTask<Object>(runnable, null)

FutureTask futureTask =

new FutureTask(new Callable() {//使用Callable接口作为构造参数

public Object call() {

//真正的任务在这里执行,这里的返回值类型为String,可以为任意类型

//ini wordLib need2s

fentsiOr
fentsiCca22=new fentsiOr();

fentsiCca22.iniFentsiWordlibFromdb();//haosi 2s

return fentsiCca22;

}});

// 使用futureTask创建一个线程

Thread Thread1 = new Thread(futureTask);

Thread1.start();

// 测试后台的计算线程是否完成,如果未完成则等待

// if (!futureTask.isDone()) {

System.out.println("--other work");

//need 300 ms about

System.out.println("--start ini renva envent db");

renvaEventC rec=new renvaEventC();

rec.iniTypeKeywordLibFromDB();

System.out.println(" rec.iniTypeKeywordLibFromDB(); ok" );

rec.iniEventKeywordlibFromdb();

//ini wordlib in writeToIndex();

//ini word_stopword not need

//cb3 ini map_Renva4problem

this.inimap4Renva(); //prob renva fenlei map 180ms

// renvaEventC rec = null;

System.out.println("--start ini renva envent db finish");

fentsiOr fentsiOrcb9;

try {

fentsiOrcb9 = (fentsiOr) futureTask.get();

// future.get(5000, TimeUnit.MILLISECONDS); //取得结果,同时设置超时执行时间为5秒。

} catch (Exception e1) {

e1.printStackTrace();

throw new RuntimeException(e1);

}

System.out.println(fentsiOrcb9);

参考:

Future和FutureTask - 每天进步一点点! - ITeye技术网站.htm

java Future 接口介绍 - yangyan19870319的专栏 - 博客频道 - CSDN.NET.htm

java Future用法和意义一句话击破_archlinux吧_百度贴吧.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: