Jiangshachina
同是Java爱好者,相逢何必曾相识!
a cup of Java, cheers!
::
首页
:: ::
联系
::
聚合
::
管理
::
41 随笔 :: 1 文章 :: 216 评论 :: 0 Trackbacks
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
公告
留言簿
(7)
给我留言
查看公开留言
查看私人留言
随笔分类
(134)
App Server(1)
(rss)
Applet(2)
(rss)
Concurrency(2)
(rss)
CoreJavaTechTips(2)
(rss)
Database(9)
(rss)
db4o(2)
(rss)
Eclipse(3)
(rss)
English
(rss)
Generic(1)
(rss)
GUI(3)
(rss)
Java(22)
(rss)
JavaEE
(rss)
JavaOne(2)
(rss)
JavaSE(8)
(rss)
JavaTutorials(2)
(rss)
JFreeChart(2)
(rss)
JStockChart(2)
(rss)
JUnit(1)
(rss)
Linux(4)
(rss)
Maven(5)
(rss)
MySQL(5)
(rss)
NetBeans(2)
(rss)
Oracle(2)
(rss)
Others(12)
(rss)
SunTechDays(3)
(rss)
Swing(1)
(rss)
Translation(17)
(rss)
UnitTest(2)
(rss)
翻译(17)
(rss)
随笔档案
(42)
2008年10月 (3)
2008年9月 (1)
2008年8月 (1)
2008年7月 (2)
2008年6月 (2)
2008年5月 (2)
2008年4月 (1)
2008年2月 (1)
2007年12月 (1)
2007年11月 (2)
2007年10月 (2)
2007年9月 (1)
2007年7月 (1)
2007年6月 (3)
2007年5月 (1)
2007年4月 (1)
2007年3月 (1)
2007年1月 (1)
2006年12月 (1)
2006年11月 (1)
2006年10月 (1)
2006年9月 (3)
2006年8月 (9)
文章分类
Concurrency
(rss)
Java
(rss)
Java SE
(rss)
Attach
搜索
积分与排名
积分 - 57746
排名 - 151
最新评论
1. re: 判定一个点是否在三角形内(原)
> 如果已经知道三角形三个顶点的坐标,如何判断另一点是否在这个三角形内呢?
这不正是我的这篇Blog所涉及的内容嘛 :-
--Sha Jiang
2. re: 判定一个点是否在三角形内(原)
如果已经知道三角形三个顶点的坐标,如何判断另一点是否在这个三角形内呢?
谢谢!
--Fu
3. re: JStockChart -- Preview(原)
评论内容较长,点击标题查看
--Sha Jiang
4. re: JStockChart -- Preview(原)
评论内容较长,点击标题查看
--eric_yin
5. re: NetBeans vs. Eclipse RCP: 插件机制比较(译)
做开发工具就是为简单易用,其他的都是扯淡
--bennycompile
6. re: NetBeans vs. Eclipse RCP: 插件机制比较(译)
现在的netbeans RCP 也可以不用些layer.xml 文件的。他是可选的。
--日月雨林@gmail.com
7. re: 支持Unicode并不意味着应用是国际化的
如果翻译时遇上很多"非正常"英文,像我这种初级译者,就真束手无策了。
毕竟,技术文章作者不是语言专家,遣词造句都比较随意的。
--Sha Jiang
8. re: 支持Unicode并不意味着应用是国际化的
看来老外也需要补习语文基础
--good
9. re: 支持Unicode并不意味着应用是国际化的
> 不知是原文如此,还是翻译的,语言如此拗口啰嗦。
> 其实简单几句话就能讲清楚:
我也有同感 :-
原文就啰嗦,我翻译的也有些绕口 ^_^
--Sha Jiang
10. re: 支持Unicode并不意味着应用是国际化的
顶楼上。
--Eng?
阅读排行榜
1. Maven入门--概念与实例(原)(4357)
2. Maven入门--较复杂的实例(原)(2968)
3. 使用Callable返回结果(译)(2372)
4. Maven Weed(原)(2229)
5. Continuum入门--实例(原)(2211)
6. Rock Star 2008 -- Chet Haase(译)(2123)
7. 下一代Java Applet插件技术(译)(1672)
8. Rock Star 2008 -- Joshua Bloch(译)(1615)
9. JStockChart -- Getting Started(Timeseries)(原)(1561)
10. 何时编写单元测试?(译)(1527)
评论排行榜
1. Maven Weed(原)(33)
2. Maven入门--概念与实例(原)(15)
3. Maven入门--较复杂的实例(原)(14)
4. Sun Tech Days 2007 -- Preview(原)(14)
5. Java Tutorials -- Generics(译)(13)
6. Sun Tech Days 2007 -- Day 2(原)(12)
7. JStockChart -- Preview(原)(11)
8. Sun Tech Days 2007 -- Day 1(原)(10)
9. Continuum入门--实例(原)(10)
10. "Java"的由来(译)(9)
60天内阅读排行
1. JStockChart -- Getting Started(Timeseries)(原)(1561)
2. JStockChart -- Preview(原)(1196)
3. 编写好的面向对象代码(译)(1186)
4. 支持Unicode并不意味着应用是国际化的(译)(885)
5. NetBeans vs. Eclipse RCP: 插件机制比较(译)(712)
使用Callable返回结果(译)
使用Callable返回结果
本文是Sun官方以Blog形式发布的Java核心技术窍门(
JavaCoreTechTip
)中的一个。本文主要介绍了Callable及其相关接口和类的使用,篇幅不长且易于理解,故翻译在了此处,相信对于准备或刚接触java.util.concurrent的朋友会有所帮助。(2008.05.31最后更新)
自从Java平台的最开始,Runnable接口就已存在了。它允许你定义一个可由线程完成的任务。如大多数人所已知的那样,它只提供了一个run方法,该方法既不接受任何参数,也不返回任何值。如果你需要从一个未完成的任务中返回一个值,你就必须在该接口之外使用一个方法去等待该任务完成时通报的某种消息。例如,下面的示例就是你在这种情景下可能做的事情:
Runnable runnable = ...;
Thread t = new Thread(runnable);
t.start();
t.join();
String value = someMethodtoGetSavedValue()
严格来说,上述代码并无错误,但现在可用不同的方法去做,这要感谢J2SE 5.0引入的Callable接口。不同于Runnable接口拥有run方法,Callable接口提供的是call方法,该方法可以返回一个Object对象,或可返回任何一个在泛型化格式中定义了的特定类型的对象。
public interface Callable<V> {
V call() throws Exception;
}
因为你不可能把Callable对象传到Thread对象去执行,你可换用ExecutorService对象去执行Callable对象。该服务接受Callable对象,并经由submit方法去执行它。
<T> Future<T> submit(Callable<T> task)
如该方法的定义所示,提交一个Callable对象给ExecutorService会返回一个Future对象。然后,Future的get方法将会阻塞,直到任务完成。
为了证明这一点,下面的例子为命令行中的每个词都创建一个单独的Callable实例,然后把这些词的长度加起来。各个Callable对象将只是计算它自己的词的长度之和。Futures对象的Set集合将被保存以便从中获得计算用的值。如果需要保持返回值的顺序,则可换用一个List对象。
import java.util.*;
import java.util.concurrent.*;
public class CallableExample {
public static class WordLengthCallable
implements Callable {
private String word;
public WordLengthCallable(String word) {
this.word = word;
}
public Integer call() {
return Integer.valueOf(word.length());
}
}
public static void main(String args[]) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(3);
Set<Future<Integer>> set = new HashSet<Future≶Integer>>();
for (String word: args) {
Callable<Integer> callable = new WordLengthCallable(word);
Future<Integer> future = pool.submit(callable);
set.add(future);
}
int sum = 0;
for (Future<Integer> future : set) {
sum += future.get();
}
System.out.printf("The sum of lengths is %s%n", sum);
System.exit(sum);
}
}
WordLengthCallable保存了每个词并使用该词的长度作为call方法的返回值。这个值可能会花点儿时间去生成,不过在这个例子中,可以立即知道它。 call方法的唯一要求是这个值要在call方法的结尾处返回。当Future的get方法稍后被调用时,如果任务运行得很快的话,Future将会自动得到这个值(如同本例的情况),否则将一直等到该值生成完毕为止。多次调用get方法不会导致任务从该线程返回。因为该程序的目的是计划所有字的长度之和,它不会强令Callable任务结束。如果最后一个任务在前三个任务之前完成,也是没错的。对Future的get方法的第一次调用将只会等待Set中第一个任务结束,而不会阻塞其它的任务分别执行完毕。它只会等待当次线程或任务结束。这个特定的例子使用固定数线程池来产生ExecutorService对象,但其它有效的方法也是可行的。
关于执行器和线程池用法的更多信息,请见Java Tutorial中
Executors
一节。SwingWorker类是另一个使用Future的Runnable对象的例子,尽管有些微不同之处。更多信息请见Java Tutorial中
Worker Threads and SwingWorker
一节。
posted on 2008-05-31 22:24
Sha Jiang
阅读(2372)
评论(0)
编辑
收藏
所属分类:
JavaSE
、
Java
、
Concurrency
、
Translation
、
CoreJavaTechTips
、
翻译
IT新闻
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-06-09 20:33 编辑过
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
相关文章:
判定一个点是否在三角形内(原)
使用Callable返回结果(译)
字符串排序(译)
Java Tutorials -- Concurrency(译)
Java Tutorials -- Generics(译)
Rock Star Josh Bloch(译)
Maven入门--较复杂的实例(原)
Java Weed(原)
Powered by:
BlogJava
Copyright © Sha Jiang