线程池是预先创建线程的一种技术,线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中,如何对这些资源进行复用,减少频繁的创建和销毁对象。
Java里面线程池的顶级接口是Executor,是一个执行线程的工具
线程池接口是ExecutorService
创建线程池有4种方法:
方法一:创建一个单线程的线程池
这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务,如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它,次线程池保证所有任务的执行顺序按照任务的提交顺序执行
ExecutorService es = Executors.newSingleThreadExecutor();
示例代码:
public class ThreadDemo2 {
public static void main(String[] args) {
//创建线程池,4种方法
//方法一:创建一个单线程的线程池
ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(new MyRunnable6());
es.execute(new MyRunnable6());
es.shutdown();
}
}
class MyRunnable6 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("run0-----"+i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
方法二:创建一个固定大小的线程池
每次提交一个任务就创建一个线程,知道线程达到线程池的最大大小,线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,name线程会补充一个新线程
ExecutorService es = Executors.newFixedThreadPool(2);
方法四:创建一个可缓存的线程池
用的不多,除非一些比较大的项目
如果线程池的大小超过了处理任务所需要的线程,那么就会回售部分空闲(60s不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务,此线程池不会对线程池大小做限制,线程池大小完全依赖于操作现场(或者JVM)能够创建的最大线程大小
ExecutorService es = Executors.newCachedThreadPool();
方法四:创建一个大小无限线程池
此线程池支持定时以及周期性执行任务的需求
定时的操作:
ScheduledExecutorService es = Executors.newScheduledThreadPool(3);
es.schedule(new MyRunnable6(),3000, TimeUnit.MILLISECONDS);