zoukankan      html  css  js  c++  java
  • 常见线程池 newFixedThreadPool 的简单使用

    package com.aaa.threaddemo;
    
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    /*
     *一  四种常见的线程池是啥?
     *        newFixedThreadPool 
     *            1.创建一个可重用固定线程数的线程池, 2.使用共享的无界队列方式来运行这些线程。
     *
     *        newCachedThreadPool  
     *            1.可根据需要创建新线程的线程池  2.旧的线程可用时将重用他们  3.对短期异步的程序  可提高程序性能
     *
     *        newSingleThreadExecutor
     *            1.返回一个线程池,只有一个线程  2.可以在旧的线程挂掉之后,重新启动一个新的线程来替代它。  达到起死回生的效果。
     *        
     *        newScheduledThreadPool
     *            给定一个延迟后,可以运行命令或者定期执行。     
     *   java中线程池的顶级接口是Executor  严格而言,正在的线程池是ExecutorService
     *   
     *二  阻塞队列 LinkedBlockingQueue 使用注意事项?
     *
     *三  线程池提交任务的方式?
     *
     *四  shutdown 的使用方式?
     *
     *五  线程池中的常用参数设置?
     */
    
    
    /*
     二     newFixedThreadPool
     *        1.创建一个固定大小的线程池
     *        2.提交一个任务,就创建一个线程,直到线程池的最大容量。
     *        3.线程池的大小达到最大值,就保持不变。
     *        4.有执行异常而结束的线程,线程池会补充一个新的线程。
     *        5.使用完毕,必须手动关闭线程池,否则会一直存在内存中
     *
     *        看一下newFiexdThreadPool()的内心世界
     public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>());  
     */
    
    public class ThreaPoolUser {
        public static void main(String[] args) {
            ExecutorService fixedPool = Executors.newFixedThreadPool(2);    //创建一个可重用,固定线程数的线程池 容量为 2
                
    /*
             线程池的容量是2,我这里放入了3个线程,线程池会如何处理? 
             可以看到这里有个没有指定容量的队列  linkedBlockingQueue,此时的队列就是一个无边界的队列。 
             可以不断的在队列中添加任务
             多放一个问题不大,300000个呢? 任务过多,就会导致内存溢出。
             
             【注意!】 
             linkedBlockingQueue  
                 本身是一个用链表结实现的有界阻塞队列,容量是可以设置的。
             较好的使用方式
             
             五        ExecutorService executorService = new ThreadPoolExecutor(
                    10,        //核心线程数
                    13,        //线程池最大容量
                    60L,    //非核心线程的生存时间
                    TimeUnit.SECONDS,  //生存的时间单位
                    new ArrayBlockingQueue(10)); //设置队列中的容量
    */
            FiexdDemo fiexdDemo = new FiexdDemo();
            FiexdDemo fiexdDemo2 = new FiexdDemo();
            FiexdDemo fiexdDemo3 = new FiexdDemo();
            
            /*
             三  线程池提交任务的方式有两种 
             *         1.execute
             *             提交的是runnable类型的任务,下文的线程是继承了thread,thread又是runnable的实现类。
             *             提交是没有返回值的
             *             遇到异常直接抛出
             * 
             *         2.submit
             *             runnable 和 callable 都可提交
             *             返回一个future类型的对象
             *             将异常存储,调用future get方法 才会抛出异常
             */
            fixedPool.execute(fiexdDemo);
            fixedPool.execute(fiexdDemo2);
            fixedPool.execute(fiexdDemo3);
            
            /*
             四 shutdown()  
             * 1.把线程池的状态设置为  shutdown,但是并不会马上停止
             * 2.停止接受外部的submit 任务
             * 3.线程池正在运行的任务,队列中等待的任务,会执行完
             * 4.完成后,才是真正的停止
             */
            fixedPool.shutdown();    //手动关闭线程池
        }
    }
    
    /*
     * 上面已经创建好了一个固定的线程池,这边创建一个多线程。
     * 把线程放进 线程池中就完事了。
     */
    class FiexdDemo extends Thread{
        @Override
        public void run() {
                System.out.println("我是一个线程");
                System.out.println("[currentThread = ]" + Thread.currentThread().getName());        
        }
    }

    看下结果

  • 相关阅读:
    iOS7上在xib中使用UITableViewController设置背景色bug
    Android 转载一篇.9图片详解文章
    Android 中4种屏幕尺寸
    网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
    防火墙简介
    Makefile有三个非常有用的变量。分别是$@,$^,$
    makefile简单helloworld
    Python异常处理try except
    shell 读取配置文件的方法
    ubuntu 添加开机启动服务
  • 原文地址:https://www.cnblogs.com/ZXF6/p/14010039.html
Copyright © 2011-2022 走看看