创建线程池的方法_java引用就是对象本身

创建线程池的方法_java引用就是对象本身创建线程池的方法一、创建线程池的三种方法Executors.newSingleThreadExecutor();//单个线程Executors.newFixedThreadPool(5);//创建一个固定的线程池Executors.newCachedThreadPool();//创建一个可伸缩的线程池1.newSingleThreadExecutorimportjava.util.concurrent.ExecutorService;importjava.util.concurr

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

创建线程池的方法

一、创建线程池的三种方法

Executors.newSingleThreadExecutor(); //单个线程
Executors.newFixedThreadPool(5); //创建一个固定的线程池
Executors.newCachedThreadPool(); //创建一个可伸缩的线程池

1.newSingleThreadExecutor

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

public class ExecuterTest1 { 
   
    public static void main(String[] args) { 
   
        ExecutorService threadPool = Executors.newSingleThreadExecutor();  //单个线程
        try { 
   
            for(int i=0;i<10;i++) { 
   
                threadPool.execute(()->{ 
   
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        }catch (Exception e) { 
   
            e.printStackTrace();
        }finally { 
   
            //关闭线程池
            threadPool.shutdown();
        }

    }
}

2. newFixedThreadPool

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

public class ExecuterTest1 { 
   
    public static void main(String[] args) { 
   
        ExecutorService threadPool = Executors.newFixedThreadPool(5); //创建一个固定的线程池

        try { 
   
            for(int i=0;i<10;i++) { 
   
                threadPool.execute(()->{ 
   
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        }catch (Exception e) { 
   
            e.printStackTrace();
        }finally { 
   
            //关闭线程池
            threadPool.shutdown();
        }

    }
}

3. newCachedThreadPool

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

public class ExecuterTest1 { 
   
    public static void main(String[] args) { 
   
        ExecutorService threadPool = Executors.newCachedThreadPool();  //创建一个可伸缩的线程池
        try { 
   
            for(int i=0;i<10;i++) { 
   
                threadPool.execute(()->{ 
   
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        }catch (Exception e) { 
   
            e.printStackTrace();
        }finally { 
   
            //关闭线程池
            threadPool.shutdown();
        }

    }
}

二、三种方法的源码

public static ExecutorService newSingleThreadExecutor() { 
   
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

//#############################################################

public static ExecutorService newFixedThreadPool(int nThreads) { 
   
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

//############################################################

public static ExecutorService newCachedThreadPool() { 
   
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,  //约等于20亿
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}
  • 以上三种方法中都调用ThreadPoolExecutor来创建线程池。
  • 但三种方法都存在一定的弊端:
  • (1)SingleThreadExecutor和FixedThreadPool允许的请求队列长度为Integer.MAX.VALUE,可能会导致OOM
  • (2)CachedThreadPool允许的创建线程数量为Integer.MAX.VALUE,可能会导致OOM

ThreadPoolExecutor源码分析

    public ThreadPoolExecutor(int corePoolSize,     //核心线程池大小
                              int maximumPoolSize,  //最大核心线程池大小
                              long keepAliveTime,   //超时了没有人调用就会释放
                              TimeUnit unit,   //超时单位
                              BlockingQueue<Runnable> workQueue,   //阻塞队列
                              ThreadFactory threadFactory,        //线程工厂,创建线程的,一般不用动
                              RejectedExecutionHandler handler) { 
      //拒绝策略
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187308.html原文链接:https://javaforall.net

(0)
上一篇 2022年9月30日 下午10:36
下一篇 2022年9月30日 下午10:36


相关推荐

  • 手推向量投影长度、投影向量

    手推向量投影长度、投影向量投影 t uy ng 数学术语 指图形的影子投到一个面或一条线上 声明向量 F 为 F 向量 F 的大小为 F 向量 b 为 b 向量 b 的大小为 b 当我们得到了投影的大小之后 F 因为 F 在 b 上所以单位向量相同 F 和 b 存在一个比值关系如下 F F b b 因此投影向量 F 为 F b b

    2026年3月19日
    1
  • java找不到或无法加载主类_java找不到或无法加载主类如何解决?解决方法「建议收藏」

    java找不到或无法加载主类_java找不到或无法加载主类如何解决?解决方法「建议收藏」相信有很多人都遇到过java找不到或无法加载主类的这个问题,那么这究竟是什么原因造成的呢?有什么方法可以解决这个问题吗?问题:java文件导入到一个包当中,之后在class文件当中加入一张图片;解决:将class文件中的照片删除即可当然这只是一种情况,对于这样的情况下面做了一下总结,主要的话有下面的几种解决方法。解决方法:检查一下自己的环境变量是不是配置成功win+r输入cmd-输入java…

    2025年7月24日
    4
  • javascript uint8数组和uint32之间的转换

    javascript uint8数组和uint32之间的转换低位在前,高位在后functionintTobytes(value){vara=newUint8Array(4)a[3]=(value>>24)&0xFFa[2]=(value>>16)&0xFFa[1]=(value>>8)&0xFFa[0]=value

    2025年9月1日
    13
  • Java Web安全之代码审计

    Java Web安全之代码审计信息安全的75%发生在Web应用而非网络层。本文内容主要以JavaWeb安全-代码审计为中心展开。一、JavaWeb安全基础1.何为代码审计?通俗的说Java代码审计就是通过审计Java代码来发现Java应用程序自身中存在的安全问题,由于Java本身是编译型语言,所以即便只有class文件的情况下我们依然可以对Java代码进行审计。对于未编译的Java源代码文件我们可以直接阅读其…

    2022年7月8日
    55
  • MJ基础教程第十六课 使用midjourney训练风格模型

    MJ基础教程第十六课 使用midjourney训练风格模型

    2026年3月15日
    2
  • 西瓜视频地址解析_西瓜去水印免费

    西瓜视频地址解析_西瓜去水印免费json解析工具:https://www.json.cn/base64解析工具:https://www.sojson.com/base64.html1.先获取videoid2.通过videoid

    2022年8月2日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号