JAVA常用的几种线程池

  好久不写博客了,深感愧疚。最近写的一个需求,定时任务去发接口到大数据平台查询信息,六个小时查询大概30000次。测试环境下查询一次大概一秒,没想到到了生产上竟然要惊人的4秒一次!  很显然,单线程无法完成工作。看了我们系统里的线程池,原话是这么说的“Executors.newFixedThreadPoll(5)”,好吧,只有五条,心累。。

  

 啊啊工作好累~下次写

一、线程池的优点

  线程池的优点就是节约时间,因为线程的创建和销毁都需要大量资源,线程池相当于先把线程统一都创建出来,相当于懒汉模式?是一种用空间换时间的做法。

二、线程池的缺点

  首先多线程的危险就在于容易造成死锁,是由于多个线程之间共享变量造成的,其次线程池在一次性创建了很多线程的情况下,虽然调用的时候效率更高,但是一旦线程池被创建出来,资源就会一直被占用,可能会造成资源不足。

三、常用线程池

  1、newFixedThreadPool:这是一种固定线程数的线程池,当前线程数大于总数则会等待。最常用的线程池,用多少线程,创建的时候带个参数就行了,相对来说占用内存也不大。

private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);//线程数
    
fixedThreadPool.execute(new Runnable() {

  public void run(){

   //业务逻辑

  }

});
    

  2、newCachedThreadPool:缓存线程池,可无限大,当一个线程的任务执行完后,再有任务会服用这个线程,如果线程一段时间(默认1min)没有新的任务,就会终止该线程,有新任务时则会新创建线程。

public class ThreadPoolCached {
  public static void main(String[] args) {
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    for (int i = 0; i < 10; i++) {
      final int index = i;
      try {
        Thread.sleep(index * 100);
      }catch (Exception e) {
      e.printStackTrace();
  }

  cachedThreadPool.execute(new Runnable() {
    @Override
    public void run() {
      System.out.println(index+"当前线程"+Thread.currentThread().getName());
    }
    });
  }
}

  执行结果均为线程1,因为线程1已经执行完当前任务,再有任务进来会复用线程1。

  3、ScheduledThreadPool:定时任务线程池,这没什么好说的,其实就是FixedThreadPool的定时任务版本

public class ScheduledThreadPool {
    private static ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
    public static void main(String args[]){
        for(int i=0;i<10;i++){
            System.out.println("线程"+i+"开始执行,时间"+new Date());
            scheduledThreadPool.schedule(new Runnable() {
                public void run(){
                    System.out.println(Thread.currentThread().getName()+"正在被执行");
                    System.out.println(new Date());
                }
            }, 3, TimeUnit.SECONDS);//定时任务
        }
    }
}

  创建了4个线程,均在3秒后开始创建。

  4、newSingleThreadExecutor:单线程线程池,用来保证只用唯一的线程来执行,保证先进先出(FIFO),顺序执行不插队。。这个我真不知道有什么用。哈哈~

posted @ 2020-05-25 15:10  你又来写博客了  阅读(428)  评论(0)    收藏  举报