Executors介绍:
工具类Executors是jdk自带的创建线程池的工具【Executors来创建线程池,最后还得调用 ThreadPoolExecutor 类的构造方法来创建线程池对象,所以创建线程池,最好直接使用 ThreadPoolExecutor 类的构造方法去创建!】
Executors创建线程池的常用方法
1.newCachedThreadPool方式
它的源码:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
/**
* 1.工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。
* 2.如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
* 3.在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。
*/
public static void newCachedThreadPool(){
//1.创建可缓存的线程池,可重复利用
ExecutorService newExecutorService = Executors.newCachedThreadPool();
//创建了10个线程
for (int i = 0; i < 10; i++) {
int temp = i;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
newExecutorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("threadName;"+Thread.currentThread().getName()+",i"+temp);
}
});
}
}
2.newFixedThreadPool方式
它的源码:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
/**
* 核心线程数与最大线程数相等
* 1.创建的线程数量固定,可控制线程最大并发数,超出的线程会在队列中等待
* 2.创建的线程可以重复使用
* 3.提交一个任务,就创建一个线程,直到达到线程池的最大容量
* 4.有执行异常结束的线程,线程池会补充一个新的线程
* 5.使用无边界的队列来存储需要执行的任务
* 6.使用完成,需要手动关闭线程池
*/
public static void newFixedThreadPool(){
//1.创建可固定长度的线程池
ExecutorService newExecutorService = Executors.newFixedThreadPool(4);
//创建了10个线程
for (int i = 0; i < 10; i++) {
int temp = i;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
newExecutorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("threadName;"+Thread.currentThread().getName()+",i"+temp);
}
});
}
}
3.newScheduledThreadPool方式
它的源码:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
/**
* 延时启动 、定时启动 、可以自定义核心线程数,
*/
public static void newScheduledThreadPool(){
//1.创建可定时线程池
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(5);
for (int i = 0; i < 10; i++) {
final int temp = i;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
newScheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println("threadName;"+Thread.currentThread().getName()+",i"+temp);
}
}, 2, TimeUnit.SECONDS);
}
newScheduledThreadPool.shutdown();
}
4.newSingleThreadExecutor方式
它的源码:
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
/**
* 结果依次输出,相当于顺序执行各个任务
*/
public static void newSingleThreadExecutor(){
//1.创建单线程
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int temp = i;
newSingleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println("threadName;"+Thread.currentThread().getName()+",i"+temp);
try {
Thread.sleep(300);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
newSingleThreadExecutor.shutdown();
}