Executors 与线程池
来源:互联网 发布:淘宝客服语言技巧 编辑:程序博客网 时间:2024/05/17 00:57
1
Runnable runnable =
new
Runnable(){
2
public
void
run(){
3
System.out.println(
"Run"
);
4
}
5
}
你可以简单的在壹個线程中运行它:
1
new
Thread(runnable).start();
这個代码很简洁,但是如果我们想并行的启动多個任务该怎么办呢,而且我们还想等待所有任务完成之后获取所有任务的返回值,这样的话实际上要想保持较好的代码风格就比较有困难了。不过,就像所有其它的难题壹样,Java 为我们提供了壹個解决方案,那就是Executor ,这個简单的类允许你创建线程池和线程工厂。线程池实际表现为 ExecutorService 类的壹個实例。通过使用 ExecutorService ,你可以提交将在未来完成的任务。这里有几种你通过 Executor 类可以创建的线程池:
1、单线程的 Executor:只有壹個线程的线程池。所以所有提交的任务都会被顺序执行。方法名称:Executors.newSingleThreadExecutor();
2、缓存池:壹個创建足够多的线程的线程池,可以并行的执行所有任务。旧的线程会被重新用于新的任务。如果线程在60秒内没有被用到,这個线程就会被终止并且从线程池中移除掉。方法名称:Executors.newCachedThreadPool();
3、固定的线程池:壹個有着固定数量的线程的线程池。如果对于某個任务而言某线程不可用,这個任务会被放进队列中等待其它的任务完成之后再执行。方法名称:Executors.newFixedThreadPool();
4、定时的线程池:壹個为定时任务准备的线程池。方法名称:Executors.newScheduledThreadPool();
5、定时的单個线程的线程池:壹個为定时的未来的任务准备的单個线程的线程池,方法名称:Executors.newSingleThreadScheduledExecutor();
壹旦你有了壹個线程池,你可以使用上述不同的提交方法提交你的任务了。你可以提交壹個 Runnable 或者 Callable 的任务到线程池中。这個方法返回壹個 Future 对象,用于表示这個任务在未来的状态。如果你提交壹個 Runnable 的任务,那么 Future 返回 null 壹旦任务结束。
举個例子,如果你有如下这样壹個 Callable 的任务:
1
private
final
class
StringTask
implements
Callable<String> {
2
public
String call(){
3
//耗时的操作
4
return
"Run"
;
5
}
6
}
如果你希望使用4個线程执行该任务10次,你可以使用如下代码:
1
ExecutorService pool = Executors.newFixedThreadPool(
4
);
2
3
for
(
int
i =
0
; i <
10
; i++){
4
pool.submit(
new
StringTask());
5
}
1
pool.shutdown();
然而,如果使用上面的样例代码,你永远不会获得任务执行后的结果。所以我们接下来使用 Future 对象来完成这些任务:
01
ExecutorService pool = Executors.newFixedThreadPool(
4
);
02
List<Future<String>> futures =
new
ArrayList<Future<String>>(
10
);
03
for
(
int
i =
0
; i <
10
; i++){
04
futures.add(pool.submit(
new
StringTask()));
05
}
06
07
for
(Future<String> future : futures){
08
String result = future.get();
09
//计算结果
10
}
11
12
pool.shutdown();
CompletionService 是壹個让 executor 等待提交任务的执行结果变的容易的服务。 它的壹個实现ExecutorCompletionService 是基于 ExecutorService 来完成工作的。所以让我们来试试:
01
ExecutorService threadPool = Executors.newFixedThreadPool(
4
);
02
CompletionService<String> pool =
new
ExecutorCompletionService<String>(threadPool);
03
04
for
(
int
i =
0
; i <
10
; i++){
05
pool.submit(
new
StringTask());
06
}
07
08
for
(
int
i =
0
; i <
10
; i++){
09
String result = pool.take().get();
10
//计算结果
11
}
12
13
threadPool.shutdown();
通过上述介绍,你的手里现在有了使用线程池来处理并行任务的高性能工具,通过使用 Executors,ExecutorService 和 CompletionService 你可以创建壹個复杂的算法来使用多個任务。通过使用这些工具,改变并行运行的线程数量,或者增加更多任务而不改变很多代码也变的容易了。我希望这篇文章能够帮助你写出更好的并行运算的代码。
本文英文原文出自 http://www.baptiste-wicht.com/2010/09/java-concurrency-part-7-executors-and-thread-pools/,中文翻译首发开源中国社区http://my.oschina.net/bairrfhoinn/blog/167113,转载请注明原始出处。
- Executors 与线程池
- 线程学习三:线程池ThreadPoolExecutor 与 Executors
- Java Executors(线程池)
- java Executors(线程池)
- Java Executors(线程池)
- Executors 和线程池
- Java Executors(线程池)
- Executors线程池--java
- 线程池 Executors 入门
- Java Executors(线程池)
- java Executors线程池
- Java线程池Executors
- 线程池 Executors
- Java Executors(线程池)
- Executors 线程池
- Java Executors(线程池)
- 线程池 Executors 入门
- Java Executors(线程池)
- 【转载】Logistic regression (逻辑回归) 概述
- U盘基本工作原理
- 在不同平台获取机器名(windows or linux)
- leetcode Word Ladder II hash BFS
- hud 4718 The LCIS on the Tree(树链剖分+线段树区间合并)
- Executors 与线程池
- 3D旋转的时钟
- Flash AIR)AIR操作zip解压文件到指定目录下
- linux下释放cache内存
- Dicom学习之一:大尾和小尾LittleEndian/BigEndian
- Why doesn't AlTER SYSTEM SET EVENTS set the events or tracing immediately?
- IOCP+WinSock2新函数打造高性能SOCKET池
- Martin Odersky Scala编程公开课 第三周作业
- evernote-bak