考
虑以下场景:浏览网页时,浏览器了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库,正如其名,是一种将Java 5及以上版本的并发特性“回移植”到Java 1.4及更早版本的工具,使得开发者能在较旧的Java环境中享受现代并发编程的优势。本文将深入探讨这个库的2.2和3.1两个...
- `java.lang.Thread`和`java.util.concurrent`:提供了多线程编程的支持,包括创建和管理线程、线程同步和并发工具。 4. **JDBC**: - `java.sql`:提供了与数据库交互的接口和类,如`Connection`、`Statement`...
4. 并发工具:提供了一些新的并发工具类,如`java.util.concurrent`包下的`CountDownLatch`、`CyclicBarrier`和`Phaser`,这些工具帮助开发者更高效地管理多线程程序。 5. JDBC增强:JDBC API进行了扩展,增加了对...
JDK 17.0.1是Java的一个长期支持(LTS)版本,它带来了诸多性能提升、新特性和安全性改进。JDK 17遵循每六个月发布一个新版本的节奏,为开发者提供了持续的创新和技术更新。作为LTS版本,它将获得更长时间的支持,...
"backport-util-concurrent-3.1.jar"是Java.util.concurrent包的回移植版本,主要用于Java 5之前的JRE环境。它提供了与Java 5及更高版本相同的并发工具类,如线程池、Future、CyclicBarrier等。这些工具可以提高多...
函数式接口是指只有一个抽象方法的接口,例如`java.util.function.Function`、`java.util.concurrent.Callable`等。这些接口可以与Lambda表达式结合,增强了Java的多态性。 3. **方法引用和构造器引用**:除了...
5. **并发工具类库**:Java并发工具包(java.util.concurrent)在1.6版本中得到加强,增加了如`CountDownLatch`、`CyclicBarrier`、`Semaphore`等同步工具,便于多线程编程。 6. **XPath和XML处理**:JDK 1.6改进了...
backport-util-concurrent-3.1.jar是一个Java库,它提供了一些并发工具类,用于简化多线程编程。这个库包含了许多实用的工具类,如`FutureTask`、`CountDownLatch`、`Semaphore`等,这些工具类可以帮助开发者更好地...
1. `backport-util-concurrent-2.1-source.jar`:这是一个回退实现的并发工具库,主要用于在JDK版本较低的环境中提供Java 5及以上版本的并发API支持。 2. `geronimo-stax-api_1.0_spec-1.0.1.jar`:这是Apache ...
这份"jdk-17.0.2_doc-all"文档集全面覆盖了Java 17.0.2版本的特性,是理解、学习和使用Java编程语言的关键资源。 在Java 17.0.2中,我们可以找到以下几个关键的知识点: 1. **核心类库**:Java API文档首先会介绍...
"JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...
2. **语言特性**:JDK 8引入了许多重要的新特性,如Lambda表达式,它简化了函数式编程;方法引用来代替匿名内部类;默认方法增强了接口;新的日期和时间API (`java.time` 包);以及Stream API,它提供了一种处理集合...
5. **新引入的包**:如`java.nio.file.Paths`和`java.nio.file.FileSystems`,提供对文件系统路径的操作。 6. **I/O和NIO包**:如`java.nio`和`java.nio.channels`,包含非阻塞I/O操作。 7. **反射和注解处理**:...
5. **日期和时间API**:在`java.time`包下,替代了过时的`java.util.Date`和`java.util.Calendar`,提供了更易用的API,如`LocalDate`, `LocalTime`, `LocalDateTime`等。 6. **默认方法**:在接口中添加的具有实现...
Java的并发编程模型在1.8中也得到了强化,`java.util.concurrent`包提供了许多高级的并发工具类,如`ExecutorService`、`Future`和`Callable`,以及线程池的管理。 **总结** Java JDK API 1.8 CHM中文版对于学习和...
1. **Java 8**: Java 8是Java平台的重大更新,引入了许多新特性,如Lambda表达式、函数式接口、Stream API、新的日期和时间API以及默认方法等,这些都极大地提高了开发效率和代码的可读性。 2. **Lambda表达式**: ...
JDK 1.7,也称为Java 7,是Java编程语言的一个重大版本,它引入了许多新特性、改进和优化,提升了开发效率和代码性能。本篇将详细介绍JDK 1.7在64位操作系统上的最新版——`jdk-7u80-windows-x64`。 首先,64位版本...
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....