考
虑以下场景:浏览网页时,浏览器了5个线程下载网页中的图片文件,由于图片大小、网站访问速度等诸多因素的影响,完成图片下载的时间就会有很大的不同。如果先下载完成的图片就会被先显示到界面上,反之,后下载的图片就后显示。
Java的并发库
的CompletionService
可
以满足这种场景要求。该接口有两个重要方法:submit()和take()。submit用于提交一个runnable或者callable,一般会提
交给一个线程池处理;而take就是取出已经执行完毕runnable或者callable实例的Future对象,如果没有满足要求的,就等待了。
CompletionService还有一个对应的方法poll,该方法与take类似,只是不会等待,如果没有满足要求,就返回null对象。
package
concurrent;
import
java.util.concurrent.Callable;
import
java.util.concurrent.CompletionService;
import
java.util.concurrent.ExecutionException;
import
java.util.concurrent.ExecutorCompletionService;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.Future;
public class
TestCompletionService
{
public static
void
main
(
String
[]
args
)
throws
InterruptedException,
ExecutionException
{
ExecutorService exec = Executors.newFixedThreadPool
(
10
)
;
CompletionService<String> serv =
new
ExecutorCompletionService<String>
(
exec
)
;
for
(
int
index =
0
; index <
5
; index++
) {
final
int
NO = index;
Callable<String> downImg =
new
Callable<String>
() {
public
String call
()
throws
Exception
{
Thread.sleep
((
long
) (
Math.random
()
*
10000
))
;
return
"Downloaded Image "
+ NO;
}
}
;
serv.submit
(
downImg
)
;
}
Thread.sleep
(
1000
*
2
)
;
System.out.println
(
"Show web content"
)
;
for
(
int
index =
0
; index <
5
; index++
) {
Future<String> task = serv.take
()
;
String img = task.get
()
;
System.out.println
(
img
)
;
}
System.out.println
(
"End"
)
;
// 关闭线程池
exec.shutdown
()
;
}
}
|
运行结果:
Show web content
Downloaded Image 1
Downloaded Image 2
Downloaded Image 4
Downloaded Image 0
Downloaded Image 3
End
分享到:
相关推荐
合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--》util.concurrent(java.util part3)
backport-util-concurrent-3.1.jar是一个Java库,它提供了一些并发工具类,用于简化多线程编程。这个库包含了许多实用的工具类,如`FutureTask`、`CountDownLatch`、`Semaphore`等,这些工具类可以帮助开发者更好地...
backport-util-concurrent(2.2 /3.1) 资源共享,有需要其他jar包的可以在评论留言,看到后我会陆续上传。
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用
backport-util-concurrent-3.1.jar barbecue-1.5-beta1.jar bcmail-jdk14-1.38.jar bcmail-jdk14-138.jar bcprov-jdk14-1.38.jar bcprov-jdk14-138.jar bcprov-jdk16-1.46.jar bctsp-jdk14-1.38.jar c3p0-0.9.1.2....
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
如何启动:以win7系统为例,最好jdk8 1.打开cmd,cd到jdk的path,本机是:cd C:\Java\jdk6\bin ...java -cp D:\javaConcurrentAnimated.jar vgrazi.concurrent.samples.launcher.ConcurrentExampleLauncher
Doug Lea关于jdk里面并发同步器的实现。
java.util.concurrent 使用jdk内置的包实现一个线程池的操作
一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...
主要介绍了出现java.util.ConcurrentModificationException 问题及解决办法的相关资料,需要的朋友可以参考下
java.util.SortedSet 分布式 java.util.Queue 分布式 of java.util.Deque 分布式 java.util.Map 分布式 java.util.concurrent.ConcurrentMap 通过TTL实现可重入 java.util.concurrent.locks.Lock 分布式 ...
java jdk api帮助文档中文版 JavaTM Platform Standard Ed. 6 所有类 软件包 java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event java.awt.font java.awt.geom ...
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...
%JACORB_HOME%\lib\backport-util-concurrent.jar;%JACORB_HOME%\lib\idl.jar; %JACORB_HOME%\lib\jacorb.jar;%JACORB_HOME%\lib\logkit-1.2.jar; %JACORB_HOME%\lib\picocontainer-1.2.jar;%JACORB_HOME%\lib\slf4j...
jdk1.7 到 jdk1.8 Map 发生了什么变化(底层)? 1.8 之后 hashMap 的数据结构发生了变化,从之前的单纯的数组+链表结构变成...解决方案是 jdk 的 ConcurrentHashMap,位于 java.util.concurrent 下,专门 解决并发问题。
java.util.concurrent.atomic java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi java.util.zip javax.accessibility javax.activation javax....
总共 16 个新特性如下: 305:Pattern Matching for instanceof (Preview) 为 instanceof 运算符引入模式匹配(预览阶段) 通过模式匹配,开发者可以用更简洁和更安全的方式来表达通用的程序逻辑。instanceof...
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...