常见的4种线程池

1、newCachedThreadPool:

/**
 * 一个可缓存线程池,如果线程池长度超过需要处理需要,可灵活回收空闲线程,若无可回收,则新建线程
 * 适合短时间的任务
 * 缺点:要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
 */

2、newFixedThreadPool:

/**
 * 定长线程池,可以控制线程最大并发数,超出的任务会在队列中等待
 * 缺点:要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
 */

3、newScheduledThreadPool:

/**
 * 定长的线程池,支持定时及周期性任务执行
 * 缺点:问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
 */

4、newSingleThreadExecutor

/**
 * 单线程的线程池,保证所有任务先进先出执行
 * 缺点:要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
 */

测试代码:

package org.tree.learndemo.juc;


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

/**
 * @author zhong
 * @version 1
 * @date 2021/02/26
 * @contact 1478168700@qq.com
 **/
public class ThreadPoolDemo {
    public static void main(String[] args) {
        testNewCachedThreadPool();
        testNewFixedThreadPool();
        testNewSheduledThreadPool();
        testNewSingleThreadExecutor();
    }

    /**
     * 一个可缓存线程池,如果线程池长度超过需要处理需要,可灵活回收空闲线程,若无可回收,则新建线程
     * 适合短时间的任务
     * 缺点:要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
     */
    public static void testNewCachedThreadPool() {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            executorService.execute(() -> {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            });
        }
        executorService.shutdown();
    }

    /**
     * 定长线程池,可以控制线程最大并发数,超出的任务会在队列中等待
     * 缺点:要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
     */
    public static void testNewFixedThreadPool() {
        //线程数5
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            executorService.submit(() -> {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            });
        }
        executorService.shutdown();

    }

    /**
     * 定长的线程池,支持定时及周期性任务执行
     * 缺点:问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
     */
    public static void testNewSheduledThreadPool() {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
        long start = System.currentTimeMillis();
        System.out.println(start);
        scheduledExecutorService.schedule(() -> {
            System.out.println(Thread.currentThread().getName());
        }, 3, TimeUnit.SECONDS);//延迟3秒
        System.out.println(System.currentTimeMillis() - start);
        scheduledExecutorService.shutdown();

    }

    /**
     * 单线程的线程池,保证所有任务先进先出执行
     * 缺点:要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
     */
    public static void testNewSingleThreadExecutor() {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            executorService.submit(() -> {
                System.out.println(Thread.currentThread().getName());
            });
        }
        executorService.shutdown();

    }
}

 

相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页