常用的四种线程池分享

常用的四种线程池分享

1、newCachedThreadPool

/*创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
优点:
1、工作线程的创建数量几乎没有限制
2、长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),
     则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
缺点:
一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪(重点)。*/

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

      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 * 1000);
                    } catch (InterruptedException e) {
                      e.printStackTrace();
                      }
                     cachedThreadPool.execute(new Runnable() {
                       public void run() {
                        System.out.println(index);
                       }
                      });
                     }
      }






效果:

这里写图片描述

2、newFixedThreadPool


/*指定工作线程数量的线程池
每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中
优点:
它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。
缺点:
在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源*/

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public static void main(String[] args) {
            ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
            for (int i = 0; i < 10; i++) {
                     final int index = i;
                     fixedThreadPool.execute(new Runnable() {
                      public void run() {
                       try {
                        System.out.println(index);
                        Thread.sleep(2000);
                       } catch (InterruptedException e) {
                        e.printStackTrace();
                       }
                      }
                     });
                    }
      }

效果:
这里写图片描述
3、newSingleThreadExecutor


/*创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,
它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
如果这个线程异常结束,会有另一个取代它,保证顺序执行。*/

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public static void main(String[] args){
            // TODO Auto-generated method stub
            ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
            for (int i = 0; i < 10; i++) {
                     final int index = i;
                     singleThreadExecutor.execute(new Runnable() {
                      public void run() {
                       try {
                        System.out.println(index);
                        Thread.sleep(2000);
                       } catch (InterruptedException e) {
                        e.printStackTrace();
                       }
                      }
                     });
                    }
      }

效果:

这里写图片描述
4、newScheduleThreadPool

/*创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。*/

public static void main(String[] args) {
            //延迟3秒执行
            ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
              scheduledThreadPool.schedule(new Runnable() {
               public void run() {
                System.out.println("delay 3 seconds");
               }
              }, 3, TimeUnit.SECONDS);
             //表示延迟1秒后每3秒执行一次
              ScheduledExecutorService scheduledThreadPool1 = Executors.newScheduledThreadPool(5);
              scheduledThreadPool1.scheduleAtFixedRate(new Runnable() {
               public void run() {
                System.out.println("delay 1 seconds, and excute every 3 seconds");
               }
              }, 1, 3, TimeUnit.SECONDS);
}

效果:
这里写图片描述

发布了95 篇原创文章 · 获赞 180 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_38316697/article/details/82594211