1 newSingleThreadExecutor 创建一个单线程化的线程池,他只会用唯一的工作线程来执行任务,保证所有线程按照指定顺序(FIFO,LIFO,优先级)执行
’ ExecutorService singleT=Executors.newSingleThreadExecutor();
for(int i=0;i<5;i++) {
final int index=i;
singleT.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(index);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
线程每隔两秒依次输出0到4;
2newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程,如无可回收 则新建线程。
ExecutorService cThread=Executors.newCachedThreadPool();
for(int i=0;i<10;i++) {
final int index=i;
cThread.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(index);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
输出 1 3 2 0 4 5 6 7 8 9
线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
3newFixedThreadPool 创建一个定长线程池,控制最大线程并发数 超出的线程会在队列中等待
ExecutorService fThread=Executors.newFixedThreadPool(3);
for(int i=0;i<10;i++) {
final int index=i;
fThread.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.print(index);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
输出 0213456879
因为线程池大小为3,每个任务输出index后sleep1秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。
4 newScheduledThreadPool
创建一个定长线程池,支持定时 周期性执行任务
ScheduledExecutorService sThread=Executors.newScheduledThreadPool(3);
//延迟3秒执行任务
sThread.schedule(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 3, TimeUnit.SECONDS);
//延迟3秒开始执行 每1秒执行一个
sThread.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 3, 1, TimeUnit.SECONDS);