1. 线程池的介绍:
在开发中,频繁的创建和销毁一个线程,是很耗资源的,为此找出了一个可以循环利用已经存在的线程来达到自己的目的,线程池顾名思义,也就是线程池的集合,通过线程池执行的线程任务,可以很有效的去规划线程的使用。
在java.util.concurrent并发包中大致有以下几种常用的线程池:
1.1 newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。可以作一个定时器使用。
1.2 newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过需要的线程数量,可灵活回收空闲线程,若无可回收,则新建线程。
1.3 newSingleThreadExecutor 创建一个单线程化的线程池, 它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行,可以控制线程的执行顺序
1.4 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待,当创建的线程池数量为1的时候。也类似于单线程化的线程池,当为1的时候,也可控制线程的执行顺序
public class ThreadPoolTest {
/**
* 测试newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
* 一般可做定时器使用
*/
public static void newScheduledThreadPoolTest(){
//corePoolSize 参数是指线程池中核心线程的数量
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
/**
* initialDelay参数,是首次执行该线程的延迟时间
* period参数,周期性执行业务逻辑的间隔时间
*/
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//执行业务逻辑
System.out.println(System.currentTimeMillis());
}
}, 10, 3, TimeUnit.SECONDS);
}
/**
* newCachedThreadPool创建一个可缓存线程池,
* 如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
*/
public static void newCachedThreadPoolTest(){
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(i * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int finalI = i;
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
//执行业务逻辑
System.out.println(finalI + ":" + System.currentTimeMillis());
}
});
}
}
/**
* newSingleThreadExecutor 创建一个单线程化的线程池,
* 它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
*/
public static void newSingleThreadExecutorTest(){
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for(int i = 0; i < 10; i++){
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
//执行业务逻辑
System.out.println(index);
}
});
}
}
/**
* newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
*/
public static void newFixedThreadPoolTest(){
//最多2个线程将处于活动状态,如果提交了2个以上的线程,那么它们将保持在队列中,直到线程可用
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);
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 (Exception e) {
e.printStackTrace();
}
}
});
}
}
public static void main(String args[]){
// ThreadPoolTest.newScheduledThreadPoolTest();
// ThreadPoolTest.newCachedThreadPoolTest();
// ThreadPoolTest.newSingleThreadExecutorTest();
ThreadPoolTest.newFixedThreadPoolTest();
}
}