JAVA提供四种线程池:
1、newCachedThreadPool创建一个可缓存线程池,线程池长度超出,则灵活回收空闲线程,若无空闲则新建线程。每次execute时,task还没有执行完(sleep500),因此会开启新的线程;如果修改sleep(0),则当需要执行第二个任务时execute第一个任务已经执行完,则会复用执行第一个任务的线程,而不创建新的线程,线程池大小不限制。
public class newCachedThreadPoolTest {
public static void main(String[] args) {
task task = new task(10);
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
Thread.sleep(200);
cachedThreadPool.execute(task);
}
}
}
class task implements Runnable {
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2、newFixedThreadPool创建固定大小的线程池,超出的线程会在队列中等待,控制最大并发数量。开启5个线程,无论睡多久,是否执行完有空闲。
public class newCachedThreadPoolTest {
public static void main(String[] args) {
task task = new task(10);
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) {
Thread.sleep(200);
cachedThreadPool.execute(task);
}
}
}
3、newScheduledThreadPool创建一个定长的线程池,支持定时、周期执行任务
4、newSingleThreadExecutor创建一个单一工作线程,保证所有任务按照指定执行顺序执行