Java线程池是1.5版本才推出的,方便大家使用多线程,就是把大量线程放到“线程池”里面,由JVM自动调度,防止大量并发导致的一些问题。
1.减少在创建和销毁线程上所花的时间以及系统资源的开销
2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存
常用的线程池有4种:
【1】单线程线程池:
ExecutorService pool = Executors.newSingleThreadExecutor();
该线程池大小为1 ,只能放入单线程。
package com.yonyou.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new MyThread());
pool.execute(new MyThread());
pool.execute(new MyThread());
pool.execute(new MyThread());
pool.execute(new MyThread());
pool.shutdown();
}
}
class MyThread extends Thread {
@Override
public void run() {
int i = 0;
while (i < 3) {
i++;
System.out.println("---->" + Thread.currentThread().getName());
}
}
}
结果:
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
【2】固定大小线程池
ExecutorService pool = Executors.newFixedThreadPool(3);
楼上代码不变,创建方法有修改,创建一个可重用的、具有固定线程数的线程池,如果大小为1,效果和上面的单线程线程池效果一样。
结果:大小为3,所以4,5线程没有放入执行。
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-3
---->pool-1-thread-3
---->pool-1-thread-3
---->pool-1-thread-3
---->pool-1-thread-2
---->pool-1-thread-3
---->pool-1-thread-1
---->pool-1-thread-3
---->pool-1-thread-2
---->pool-1-thread-2
---->pool-1-thread-1
---->pool-1-thread-1
【3】带有缓冲区的线程池
创建一个具有缓存功能的线程池,系统根据需要创建线程,这些线程将会被缓存在线程池中。
ExecutorService pool = Executors.newCachedThreadPool();
---->pool-1-thread-2
---->pool-1-thread-2
---->pool-1-thread-2
---->pool-1-thread-3
---->pool-1-thread-3
---->pool-1-thread-3
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-4
---->pool-1-thread-4
---->pool-1-thread-4
---->pool-1-thread-5
---->pool-1-thread-5
---->pool-1-thread-5
【4】 创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。
ExecutorService pool = Executors.newScheduledThreadPool(5);
---->pool-1-thread-5
---->pool-1-thread-5
---->pool-1-thread-5
---->pool-1-thread-2
---->pool-1-thread-4
---->pool-1-thread-4
---->pool-1-thread-4
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-1
---->pool-1-thread-3
---->pool-1-thread-3
---->pool-1-thread-2
---->pool-1-thread-3
---->pool-1-thread-2