原创

线程池

温馨提示:
本文最后更新于 2025年07月19日,已超过 331 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

线程池7大参数


参数参数意思
corePoolSize线程池的核心线程数
maximumPoolSize 能容纳的最大线程数
keepAliveTime 空闲线程存活时间
unit 存活的时间单位
workQueue 存放提交但未执行任务的队列
threadFactory 创建线程的工厂类:可以省略
handler 等待队列满后的拒绝策略:可以省略

 

线程池工作原理图

拒绝策略

CallerRunsPolicy线程池未关闭,则使用调用线程直接运行程序。
AbortPolicy丢弃任务,并抛出 拒绝执行 RejectedExecutionException异常信息
DiscardPolicy直接丢弃
DiscardOldestPolicy:丢弃阻塞队列中最老的一个任务,加入新任务


注意事项

手写线程池

  1.  

/**
* 可缓存线程池
* @return
*/
public static ExecutorService newCachedThreadPool(){
return new ThreadPoolExecutor(0,
Integer.MAX_VALUE,
60L,
TimeUnit.SECONDS,
new SynchronousQueue<>(),

Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
}


  1. 固定长度线程池-newFixedThreadPool

/**
* 固定长度线程池
* @return
*/
public static ExecutorService newFixedThreadPool(){
return new ThreadPoolExecutor(10,
10,
0L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(),

Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
}


  1. 单一线程池-newSingleThreadExecutor()

/**
* 单一线程池
* @return
*/
public static ExecutorService newSingleThreadExecutor(){

return new ThreadPoolExecutor(1,
1,
0L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(),

Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
}

newWorkStealingPool

public static ExecutorService newWorkStealingPool(int parallelism) {
/**
* parallelism:并行级别,通常默认为JVM可用的处理器个数
* factory:用于创建ForkJoinPool中使用的线程。
* handler:用于处理工作线程未处理的异常,默认为null
* asyncMode:用于控制WorkQueue的工作模式:队列---反队列


*/
return new ForkJoinPool(parallelism,
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null,
true);

HashSet 线程不安全 解决方案->CopyOnWriteArraySet

最新的多线程类 使用示范

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(10);
        try {
            CompletableFuture.supplyAsync(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                return 1;
            }, service).whenComplete((v, e) -> {
                if (e == null) {
                    // 模拟异常
//                    int v1 = 1 / 0;
                    System.out.println("计算完成");
                    System.out.println("v = " + v);
                }
            }).exceptionally((e) -> {
                System.out.println("计算异常");
                System.out.println("e = " + e);
                return null;
            });
            System.out.println("主线程自己忙活……");
        } catch (Exception e) {
        } finally {
            service.shutdown();
        }
    }

get()和join()

completableFuture.get()

编译时,报出检查异常。 必须抛出异常


completableFuture.join()运行阶段才报出异常



java数值运算最快的是 左移和右移

2<<2     =8   左移 相当于  乘以 2的几次方 

16>>2   =4   右移相当于  除以 2的几次方 

字符串格式化      %.2f 意思是  保留2位小数

String productName = "Java";
System.out.println(String.format(productName + " in %s price is %.2f ", "jd", 1.23456));

结果

Java in jd price is 1.23 

 





正文到此结束