龙空技术网

java 线程池的使用

尊大人 108

前言:

而今同学们对“java线程池队列满时存入数据库”大约比较关切,咱们都想要学习一些“java线程池队列满时存入数据库”的相关知识。那么小编在网上收集了一些对于“java线程池队列满时存入数据库””的相关知识,希望大家能喜欢,咱们快快来了解一下吧!

线程池能够避免频繁的线程创建和销毁的开销,因此很多时候在项目当中我们是使用的线程池去完成多线程的任务。

常见的使用方式:

1.通过java.util.concurrent.Executors

缓冲线程池,该方法返回的线程池数量不确定,根据实际情况调整。当有新任务提交时,若有空闲线程则复用,若无,则会创建新的线程处理。当所有任务完成时,线程就会返回线程池等待复用,60s未被使用,就会被销毁。可创建线程数量的最大值:Integer.MAX_VALUE。

单一线程池,返回只有一个线程的线程池。

混合线程池,返回一个固定数量线程的线程池。当有新任务提交时,若线程中有空闲线程,则立即执行,若无,则会把该任务存入到任务队列,等待空闲线程执行。

newScheduledThreadPool():返回指定数量ScheduledExecutorService对象的线程池。这个基本上用不到。

2.通过new ThreadPoolExecutor()我是比较推荐使用这种方式的,因为第一种方式也不过是对ThreadPoolExecutor进行一个封装。

我就说一下怎么使用吧。

corePoolSize -----------------------------------------核心线程池大小maximumPoolSize------------------------------------最大线程池大小keepAliveTime----------------------------------------线程最大空闲时间(指的是当当前线程池中线程大于 corePoolSize 的时候,如果超过 keepAliveTime 还没有新的任务,则释放大于 corePoolSize 部分的线程)unit------------------------------------------------------时间单位(秒,毫秒,分,时,天)workQueue-----------------------队列(arrayBlockingQueue,linkedBlockingQueue)threadFactory-------------------------------------------线程创建工厂rejectExecutionHandler---------------------------------拒绝策略(AbortPolicy,DiscardPolicy,DiscardOldestPolicy,CallerRunsPolicy,自定义)
拒绝策略篇

◇AbortPolicy

该策略是线程池的默认策略。使用该策略时,如果线程池队列满了丢掉这个任务并且抛出RejectedExecutionException异常。

◇DiscardPolicy

如果线程池队列满了,会直接丢掉这个任务并且不会有任何异常。

◇DiscardOldestPolicy

这个策略从字面上也很好理解,丢弃最老的。也就是说如果队列满了,会将最早进入队列的任务删掉腾出空间,再尝试加入队列。

CallerRunsPolicy

使用此策略,如果添加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行。

简单的使用

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(4, 6, 100, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(4));ExecutorCompletionService<线程返回的对象> executorCompletionService = new ExecutorCompletionService<>(线程池);for (int x = 0;x < 4;x++){ //创建4个线程并执行,Callable可以有返回值的 executorCompletionService.submit(new Callable(xxx); //callable执行任务 }  for (int y = 0; y < 4; y++){ //取值 try { Future<返回对象> take = executorCompletionService.take();//阻塞,等待 // Future<返回对象> take = executorCompletionService.poll();//不会阻塞  Object reList = take.get(60000, TimeUnit.MILLISECONDS); }catch (Exception e){ e.printStackTrace(); } }  threadPool.shutdown(); //创建了线程池不用了,一定要关闭了,不然机子就boom

看完以上的介绍相信大多数人应该都会基本使用了,如果用spring框架的话可以配置线程池的bean,项目启动开启,项目关闭就关闭,敢敢单单啦。

标签: #java线程池队列满时存入数据库