线程池:
所谓的线程池,就是将所有的线程都在同一个空间内管理,管理的是线程的数量,线程的创建,任务的分配
常见的线程池有好几种,我们来看一下看
线程池就是用于管理线程的,有四种线程池可用于管理线程
newSingleThreadExecutor 创建单个线程去执行所有的任务,超出的任务需要进行排队(FIFO)
newFixedThreadPool 创建指定大小的线程池,任务过多时需要排队
newScheduledThreadPool 创建指定大小的线程池,可以设置线程的执行时间与延迟时间,任务过多需要排队
newCachedThreadPoo 不限制线程的数量,对于不用的线程会回收,需要的时候直接创建
public static void main(String[] args) {
//Executors.newFixedThreadPool(5)用于创建一个大小可以设置的线程池
//Executors.newService线程池跟踪对象,需要知道每个线程都在干什么
ExecutorService executors=Executors.newCachedThreadPool();
//模拟多个任务存在时,查看线程的调度情况
for(int i=0;i<1000;i++) {
//加上sleep让线程有一个执行时间
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
//execute()返回Exectutor类型,该类型时用于进行任务调度
executors.execute(new Runnable() {
//当前执行的线程是pool-1线程池名称,再创建一个线程就是pool-2
@Override
public void run() {
System.out.println("当前执行的线程是"+Thread.currentThread().getName());
}
});
}
}
我们现在用这个大小可变的线程池来创建,有多个任务时,线程池会根据任务的数量和大小来创建足够的线程去处理
**
线程池的拒绝策略
**
当队列中的任务远超队列可容纳的任务数时,线程池中也给了四种任务拒绝策略:
AbortPolicy:默认策略,直接抛异常终止系统
CallerRunsPolicy:不拒绝、不处理,将其抛给主线程进行处理
DiscardOldestPolicy:将任务队列中等待时间最长的剔除掉,接收新的任务
DiscardPolicy:当任务队列已满时,就不再接收新的任务
注意点:两个点,一个是线程的管理方式,一个是拒绝策略,这个必须要知道