资料链接http://blog.csdn.net/weihan1314/article/details/7983725点击打开链接
知道线程池的人应该都知道线程池的优点,以下列出:
1,重用线程池中的线程,避免因为频繁的创建线程带来的性能下降;
2,能有效的控制线程池的最大并发数,避免以为其共同抢占资源而造成的阻塞,
3,能够对线程进行简单的管理,提供制定间隔和定时执行。
线程池java提供了一个借口Executor,真正的线程池实现靠下面的ThreadPoolExecutor,提供了一系列的参数来配置线程池,通过配置参数来创建不同的线程池,因此我们重点理解ThreadPoolExecutor,
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue
RejectedExecutionHandler handler);
corePoolSize: 线程池维护线程的最少数量,即核心线程,如果allowCoreThreadTimeOut设置为true,即核心线程超时会被销毁,一般配置这个,所以核心线程会一直存在,不会被销毁。
maximumPoolSize:线程池维护线程的最大数量,
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略
2、Java 线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
(1). newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
ExecutorService
cachedThreadPool
=
Executors
.
newCachedThreadPool
(
)
;
for
(
int
i
=
0
;
i
<
10
;
i
++
)
{
final
int
index
=
i
;
try
{
Thread
.
sleep
(
index
*
1000
)
;
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
(
)
;
}
cachedThreadPool
.
execute
(
new
Runnable
(
)
{
@Override
public
void
run
(
)
{
System
.
out
.
println
(
index
)
;
}
}
)
;
}
|
线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
(2). newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
ExecutorService
fixedThreadPool
=
Executors
.
newFixedThreadPool
(
3
)
;
for
(
int
i
=
0
;
i
<
10
;
i
++
)
{
final
int
index
=
i
;
fixedThreadPool
.
execute
(
new
Runnable
(
)
{
@Override
public
void
run
(
)
{
try
{
System
.
out
.
println
(
index
)
;
Thread
.
sleep
(
2000
)
;
}
catch
(
InterruptedException
e
)
{
// TODO Auto-generated catch block
e
.
printStackTrace
(
)
;
}
}
}
)
;
}
|
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。可参考PreloadDataCache。
(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
1
2
3
4
5
6
7
8
|
ScheduledExecutorService
scheduledThreadPool
=
Executors
.
newScheduledThreadPool
(
5
)
;
scheduledThreadPool
.
schedule
(
new
Runnable
(
)
{
@Override
public
void
run
(
)
{
System
.
out
.
println
(
"delay 3 seconds"
)
;
}
}
,
3
,
TimeUnit
.
SECONDS
)
;
|
表示延迟3秒执行。
定期执行示例代码如下:
1
2
3
4
5
6
7
|
scheduledThreadPool
.
scheduleAtFixedRate
(
new
Runnable
(
)
{
@Override
public
void
run
(
)
{
System
.
out
.
println
(
"delay 1 seconds, and excute every 3 seconds"
)
;
}
}
,
1
,
3
,
TimeUnit
.
SECONDS
)
;
|
表示延迟1秒后每3秒执行一次。
ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。
(4)、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
ExecutorService
singleThreadExecutor
=
Executors
.
newSingleThreadExecutor
(
)
;
for
(
int
i
=
0
;
i
<
10
;
i
++
)
{
final
int
index
=
i
;
singleThreadExecutor
.
execute
(
new
Runnable
(
)
{
@Override
public
void
run
(
)
{
try
{
System
.
out
.
println
(
index
)
;
Thread
.
sleep
(
2000
)
;
}
catch
(
InterruptedException
e
)
{
// TODO Auto-generated catch block
e
.
printStackTrace
(
)
;
}
}
}
)
;
}
|