Java线程池入门02


1. 如何使用原生方式创建线程池


ThreadPoolExecutor的构造函数

ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue<Runnable>)
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue<Runnable>, ThreadFactory)
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue<Runnable>, RejectedExecutionHandler)
ThreadPoolExecutor(int, int, long, TimeUnit, BlockingQueue<Runnable>, ThreadFactory, RejectedExecutionHandler)
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

Java线程池入门02_第1张图片

核心线程只有在线程池被销毁时,才会被销毁。
非核心线程当空闲时间超过keepAliceTime就会被销毁。
任务工厂,线程池中的线程都是从任务队列中获取任务并执行的。
线程工厂,用于定义如何创建一个线程。
任务拒绝策略,即在提交到任务队列的任务会被拒绝时,该如何处理此任务。
任务被拒绝同时需要满足以下四个条件 :

  • 线程池中的线程已满
  • 无法再继续扩容
  • 没有空闲线程所有线程都在执行任务
  • 任务队列已满无法再扩容
    Java线程池入门02_第2张图片

2. 使用原生方式创建一个线程池


  • 自定义线程工厂
package LearnThreadPool;  
  
import Chapter07.ThreadPool;  
  
import java.util.concurrent.ThreadFactory;  
import java.util.concurrent.atomic.AtomicInteger;  
  
/**  
 * 自定义线程工厂  
 *  
 * @author cat  
 * @version 2025/2/24 19:20  
 * @since JDK17  
 */  
public class CustomThreadFactory implements ThreadFactory {  
    // 定义一个计数器  
    private final AtomicInteger threadNumber = new AtomicInteger(1);  
  
    @Override  
    public Thread newThread(Runnable r) {  
        // 创建线程定义任务并设置线程名称  
        return new Thread(r, "曲-" + threadNumber.getAndIncrement());  
    }   
}
  • 使用原生方式创建一个线程池并使用
package LearnThreadPool;  
  
import java.util.concurrent.LinkedBlockingQueue;  
import java.util.concurrent.ThreadFactory;  
import java.util.concurrent.ThreadPoolExecutor;  
import java.util.concurrent.TimeUnit;  
import java.util.stream.IntStream;  
  
/**  
 * 使用原生方式创建一个线程池  
 *  
 * @author cat  
 * @version 2025/2/24 19:26  
 * @since JDK17  
 */  
public class CreateThreadPool {  
    public static void m() {  
        System.out.println(Thread.currentThread().getName());  
    }  
    public static void main(String[] args) {  
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 25, 10L,  
                TimeUnit.SECONDS,  
                new LinkedBlockingQueue<>(),  
                new CustomThreadFactory(),  
                new ThreadPoolExecutor.AbortPolicy());  
        // 创建3个任务并执行  
        IntStream.range(0, 3).forEach(i -> threadPoolExecutor.execute(CreateThreadPool::m));  
        // 关闭线程池  
        threadPoolExecutor.shutdown();  
    }  
}
输出 :-2-1-3

你可能感兴趣的:(Java,java,开发语言)