pool 视频,pool house

  

  创建线程池时   

  

  不建议直接使用执行者进行创建线程池缓存线程池可能创建过多线程队列过大,造成内存溢出不同线程池之间的创建   

  

  @ SLF 4j公共课房池{/* * *不限数量创建线程,最多创建Integer.max个线程*/ExecutorService cachedThreadPool=executors。newcachedthreadpool();/** * 创建固定数量线程池*/ExecutorService fixedThreadPool=executors。newfixedthreadpool(5);/** * 单线程池*/ExecutorService singleThread=executors。newsinglethreadexecutor();/** * 定时任务线程池*/ScheduledExecutorService scheduledThreadPool=executors。newscheduledthreadpool(5);/** * 自定义线程池* 1、核心线程数-理论上讲用户线程数可以无限多,主要受机器内存影响* 2、最大线程数* 3、超过核心线程的空闲存活时间* 4、时间单位* 5、阻塞队列* LinkedBlockingQueue -如果不限定数量则是一个无界队列,可能会引起内存溢出(OOM:OUT内存不足)* ArrayBlockingQueue -有界队列*优先级阻塞队列-有界优先队列*同步队列-只能存放一个元素* 6、线程工厂* 7、拒绝策略* ThreadPoolExecutor .堕胎政策*线程池执行程序.调用者运行策略*线程池执行器.DiscardOldestPolicy *线程池执行器.discard policy */ExecutorService my self horse pool=new thread pool executor(5,10,10,TimeUnit .毫秒,new LinkedBlockingQueueRunnable(100),new ThreadFactory(){ security manager s=system。getsecuritymanager();私有最终线程组group=(s!=null)?s . getthreadgroup():线程。当前线程().getThreadGroup();私有最终原子整数线程数=新原子整数(1);private final String threadname prefix=' my self horse pool-horse-';@覆盖公共线程新线程(Runnable r){ Thread Thread=新线程(group,r,threadname前缀线程号。getandincrement(),0);返回线程;} },新建ThreadPoolExecutor .DiscardOldestPolicy());/** * 有多少个任务,则一次创建多少个线程* 从日志可以看出一共创建了10个线程*这些池通常会提高执行许多短期异步任务的程序的性能*/public void useCacheThreadPool(){ log。info('-{ }-{ }-',' useCacheThreadPool ',' start ');horse runnable horse runnable=new horse runnable();for(int I=0;i 10i ) { c   

achedThreadPool.submit(horseRunnable); } cachedThreadPool.shutdown(); } /** * 每次只启动固定数量的线程 * 如果没有线程则阻塞等待 */ public void useFixedThreadPool(){ log.info("-----------------{}---{}-------------------------","useFixedThreadPool","start"); HorseRunnable horseRunnable = new HorseRunnable(); for (int i = 0; i < 10; i++) { fixedThreadPool.submit(horseRunnable); } fixedThreadPool.shutdown(); } /** * 每次只启动一个线程执行任务 */ public void useSingleThread(){ log.info("-----------------{}---{}-------------------------","useSingleThread","start"); HorseRunnable horseRunnable = new HorseRunnable(); for (int i = 0; i < 10; i++) { singleThread.submit(horseRunnable); } singleThread.shutdown(); } /** * 定时任务 * 初始延迟1s,后期每次延迟3s */ public void useScheduledThreadPool(){ log.info("-----------------{}---{}-------------------------","useScheduledThreadPool","start"); HorseRunnable horseRunnable = new HorseRunnable(); scheduledThreadPool.scheduleAtFixedRate(horseRunnable,1,3,TimeUnit.MILLISECONDS); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); }finally { scheduledThreadPool.shutdown(); } } /** * 启动自定义线程池 */ public void useMyselfHorsePool(){ log.info("-----------------{}---{}-------------------------","useMyselfHorsePool","start"); HorseRunnable horseRunnable = new HorseRunnable(); for (int i = 0; i < 10; i++) { myselfHorsePool.submit(horseRunnable); } myselfHorsePool.shutdown(); } public void useHorsePoolCallable() throws ExecutionException, InterruptedException { ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); log.info("-----------------{}---{}-------------------------","useMySelfHorsePoolCallable","start"); HorseCallable horseCallable = new HorseCallable(); List<Future> resultList = new ArrayList<>(); for (int i = 0; i < 10; i++) { Future resultFuture = cachedThreadPool.submit(horseCallable); resultList.add(resultFuture); } for (Future future : resultList) { Object callable = future.get(); log.info("callable:{}",callable); } cachedThreadPool.shutdown(); } public void runRunnable(HousePool housePool){ int number =0; try { Thread.sleep(1000); housePool.useCacheThreadPool(); /* 通过循环调用来查看前一个线程池是否已经执行完毕 */ while(true){ if(housePool.cachedThreadPool.isTerminated()&&number==0) { housePool.useSingleThread(); number++; Thread.sleep(2000); }else if(housePool.singleThread.isTerminated()&&number==1) { housePool.useScheduledThreadPool(); number++; Thread.sleep(2000); }else if(housePool.scheduledThreadPool.isTerminated()&&number==2) { housePool.useFixedThreadPool(); number++; Thread.sleep(2000); }else if(housePool.fixedThreadPool.isTerminated()&&number==3) { housePool.useMyselfHorsePool(); number++; Thread.sleep(2000); }else if(housePool.myselfHorsePool.isTerminated()) { break; } } } catch (InterruptedException e) { e.printStackTrace(); } } public void runCallable(HousePool housePool){ try { housePool.useHorsePoolCallable(); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 执行不同类型线程池的submit方法 * 一个线程池可以同时执行实现runnable接口的方法和实现callable接口的方法 * @param args */ public static void main(String<> args) { HousePool housePool =new HousePool(); housePool.runRunnable(housePool); housePool.runCallable(housePool); }}四种拒绝策略

  

* 7、拒绝策略 直接抛弃,并报异常 * ThreadPoolExecutor.AbortPolicy调用线程来执行任务 * ThreadPoolExecutor.CallerRunsPolicy抛弃最老的任务 * ThreadPoolExecutor.DiscardOldestPolicy直接抛弃新来的任务 * ThreadPoolExecutor.DiscardPolicy

  

相关文章