Java线程池的使用

定义单例线程池:
class MyPool {
    private static MyPool myPool = null;

    private ThreadPoolExecutor threadPool=null;

    private ScheduledThreadPoolExecutor scheduledPool=null;

    public ThreadPoolExecutor getThreadPool() {
        return threadPool;
    }
    public ScheduledThreadPoolExecutor getscheduledPool(){
        return scheduledPool;
    }
    private int corePoolsize = 10;

    private int maximumPoolsize = 20;

    private long keepAliveTime =3;

    private int scheduledPoolSize =10;

    private static synchronized void create(){if(myPool == null)myPool = new MyPool();}

    public static MyPool getInstance(){if(myPool == null)
        create();
        return myPool;
    }
    private MyPool(){
        this.threadPool = new ThreadPoolExecutor(corePoolsize, maximumPoolsize,keepAliveTime, TimeUnit.SECONDS,new LinkedBlockingQueue<>(),new ThreadPoolExecutor.CallerRunsPolicy());
        this.scheduledPool = new ScheduledThreadPoolExecutor(scheduledPoolSize);
    }
}

 

创建线程池的主要参数说明:

  1. corePoolSize(int):线程池中保持的线程数量,包括空闲线程在内。也就是线程池释放的最小线程数量界限。

  2. maximumPoolSize(int): 线程池中嫩容纳最大线程数量。

  3. keepAliveTime(long): 空闲线程保持在线程池中的时间,当线程池中线程数量大于 corePoolSize 的时候。

  4. unit(TimeUnit枚举类): 上面参数时间的单位,可以是分钟,秒,毫秒等等。

  5. workQueue(BlockingQueue): 任务队列,当线程任务提交到线程池以后,首先放入队列中,然后线程池按照该任务队列依次执行相应的任务。可以使用的 workQueue 有很多,比如:LinkedBlockingQueue 等等。

  6. threadFactory(ThreadFactory类): 新线程产生工厂类。

  7. handler(RejectedExecutionHandler类): 当提交线程拒绝执行、异常的时候,处理异常的类。该类取值如下:(注意都是内部类) 

    ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出RejectedExecutionException 异常。 

    ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。

    ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务,重复此过程。 

    ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。

获取线程池并添加任务:

    public static void main(String[] args) {
        ThreadPoolExecutor pool1 = (ThreadPoolExecutor) Executors.newCachedThreadPool();
        pool1.execute(() ->{
                    for(int i = 0; i < 100; i++)
                        System.out.println("Dog"+i);
             }
        );
        pool1.execute(() ->{
                    for(int i = 0; i < 100; i++)
                        System.out.println("Cat"+i);
                }
        );
    }

  

 

posted @ 2025-01-21 17:08  TIME_小白  阅读(47)  评论(0)    收藏  举报