线程池懒加载实现初探
来源:互联网 发布:ubuntu的samba端口号 编辑:程序博客网 时间:2024/06/15 17:36
单例类:
package com.ldy.utils;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadFactory;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import org.apache.log4j.Logger;public class LazyThreadPool extends ThreadPoolExecutor{private static final Logger logger = Logger.getLogger(LazyThreadPool.class);/** * 仿Executors.newFixedThreadPool(corePoolSize, threadFactory); * return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory); * 创建指定大小线程池 * @param corePoolSize */private LazyThreadPool(int corePoolSize) {super(corePoolSize, corePoolSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {Thread t = Executors.defaultThreadFactory().newThread(r);//t.setDaemon(true);//此线程创建后,设置为后台线程logger.info("创建线程:"+t);return t;}});logger.info("懒实例执行器服务被创建:LazyThreadPool");}private static class ExecutorServiceHolder {private static ExecutorService executorService = new LazyThreadPool(1);//作为单线程池处理任务}public static ExecutorService getExecutorService() {return ExecutorServiceHolder.executorService;}@Overrideprotected void beforeExecute(Thread t, Runnable r) {System.out.println(t);if(r instanceof AbstractTask){logger.info("任务准备执行:"+((AbstractTask)r).taskName);}}@Overrideprotected void afterExecute(Runnable r, Throwable t) {if(r instanceof AbstractTask){logger.info("任务执行完成:"+((AbstractTask)r).taskName);}}@Overrideprotected void terminated() {logger.info("线程池退出");}@Overridepublic void execute(Runnable command) {// TODO Auto-generated method stubsuper.execute(this.wrapRunnable(command,clientTrace()));}@Overridepublic Future<?> submit(Runnable task) {// TODO Auto-generated method stubreturn super.submit(this.wrapRunnable(task,clientTrace()));}private Exception clientTrace(){return new Exception("任务提交所在处。");}/** * 1、知道异常在哪里抛出的 * 2、这个任务到底是在哪里提交的 * @param command * @return */private Runnable wrapRunnable(final Runnable command,final Exception clientTrace){return new Runnable() {@Overridepublic void run() {try{command.run();}catch(Exception e){clientTrace.printStackTrace();//追踪调用所在地e.printStackTrace();//防止部分任务运行时异常丢失throw e;}}};}}
package com.ldy.utils;/** * 多线程应用基类 * 任务抽象,作用于:运行时提供任务名称 * @author ldy * */public abstract class AbstractTask implements Runnable{protected String taskName;}
调用示例:
package main;import com.ldy.utils.AbstractTask;public class TestTask extends AbstractTask{public TestTask() {this.taskName = "测试线程池框架";}@Overridepublic void run() {try {Thread.currentThread().sleep(600);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("执行方法主体");System.out.println(2/0);}}
package main;import java.util.concurrent.ExecutionException;import java.util.concurrent.Future;import com.ldy.utils.LazyThreadPool;public class TestExecutorService {public static void main(String[] args) throws InterruptedException, ExecutionException {Future<?> re = LazyThreadPool.getExecutorService().submit(new TestTask());//System.out.println("任务执行完后的结果:"+re.get());//Executors.newFixedThreadPool(1).submit(new TestTask());}}
0 0
- 线程池懒加载实现初探
- Java线程池初探
- 线程池初探
- 线程池初探(一)
- 线程池初探(二)
- 线程池初探(三)
- Android实现ListView异步加载图片+缓存+线程池管理
- 自定义ImageLoader实现图片加载线程池、图片缓存
- Android fragment懒加载之初探
- Android 线程池、信号量、Looper、缓存初探
- java四种线程池初探
- ListView中使用线程实现无限加载
- 线程加载数据后的ui线程刷新实现
- android子线程加载数据,ui线程实现更新方法
- view加载初探
- Ajax异步加载初探
- Linux线程初探
- java 线程初探
- 15_由1、2、3、4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?
- docker之路--docker服务非正常结束的解决
- 剑指offer------写程序时需要考虑的小tips
- 一张图看清Unity3D 常用事件流程与频率
- 对多态中的父类、子类的认识
- 线程池懒加载实现初探
- 机房水题欢乐赛 2016-04-24 下午
- Linux 下golang的配置
- Java String.split用法
- 安装MySQL,以及解决不能写汉字问题
- JDBC 的基本操作
- java中匿名内部类的问题
- Hibernate4实战 之第五部分:Hibernate的事务和并发
- CSS-盒模型