Java 线程池详解

线程池的三大方法、七大参数、四种拒绝策略

池话技术

程序运行就是要占用系统的资源、而池技术就相当于提前准备好程序运行所需要的资源, 程序运行的时候直接到池子里面取资源, 用完会就在放回到池中。比如:线程池、连接池、常量池等。

使用池化技术能够节约系统的资源,池化能够省略到系统反复创建资源的过程。而线程池就是为了能够实现线程的服用节约一部分的资源。

三大方法

1、 创建固定大小的线程池**
ExecutorService service = Executors.newFixedThreadPool(3);
2、 创建一个缓存的线程池, 大小可变
ExecutorService service1 = Executors.newCachedThreadPool();
3、创建一个单一的线程池
ExecutorService service2 = Executors.newSingleThreadExecutor();**

public class demo01 {
    // 创建线程的三个方法
    public static void main(String[] args) {
        // 创建固定大小的线程池
        ExecutorService service = Executors.newFixedThreadPool(3);
        // 创建一个缓存的线程池, 大小可变
        ExecutorService service1 = Executors.newCachedThreadPool();
        // 创建一个单一的线程池
        ExecutorService service2 = Executors.newSingleThreadExecutor();
        try {
            for (int i = 1; i <= 5; i++) {
                service2.execute(() -> {
                    System.out.println(Thread.currentThread().getName());
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            service2.shutdown();
        }
    }
}

查看源码:三个创建线程池的方法都是使用T hreadPoolExecutor , 方法来创建的。

public class Executors {
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
    }
    
    
  		// 创建线程的七个参数  
        public ThreadPoolExecutor(
            
            int corePoolSize, // 核心线程池
            int maximumPoolSize, // 最大核心线程池
            long keepAliveTime, // 超时后没有人用就会释放
            TimeUnit unit, // 超时单位
            BlockingQueue<Runnable> workQueue, // 阻塞队列
            ThreadFactory threadFactory // 线程工厂, 不需要动
        ) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, defaultHandler);
            // defaultHandler 拒接策略
    }

手动创建线程池

// 创建线程池
public class demo02 {
    public static void main(String[] args) {
        // 创建线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(1,![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501230240283.png)

                2,
                3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(3), Executors.defaultThreadFactory()
                , new ThreadPoolExecutor.DiscardOldestPolicy()
        );
        try {
            for (int i = 1; i <= 2; i++) {
                // 线程池中, 使用 execute()来创建线程
                executor.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // shutdown ()来关闭线程池
            executor.shutdown();
        }
    }
}

四种拒绝策略

Java 线程池详解_第1张图片

/** * new ThreadPoolExecutor.AbortPolicy() // 银行满了,还有人进来,不处理这个人的,抛出异 常 * new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里! * new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢掉任务,不会抛出异常! * new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了,尝试去和早的竞争,也不会 抛出异常! */

小结

public class demo03 {

    /**
     * 最大线程应该如何定义:
     * 1、CPU密集型:最大线程数为CPU的核数
     * 2、IO密集型: > 你的程序中十分消耗IO的线程
     *
     * @param args
     */
    public static void main(String[] args) {
        // 获取当前的 cpu 核数
        System.out.println(Runtime.getRuntime().availableProcessors());
    }
}

你可能感兴趣的:(java,多线程,java)