首页 > 其他分享 >线程池

线程池

时间:2022-10-20 23:26:40浏览次数:41  
标签:队列 抛出 线程 new public ThreadPoolExecutor

线程池

概论

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。

线程池的好处

  • 降低资源的消耗

  • 提高响应速度

  • 方便管理

  • 总结:线程复用,可以控制最大线程数,方便管理

//线程池
/**线程池  三大方法   七大参数  四种拒绝方式
 * 线程池的好处
 * 1.降低资源的消耗
 * 2.提高响应的速度
 * 3.方便管理
 * 线程复用,可以控制最大线程数,方便管理
 * */
public class Demo01 {
    public static void main(String[] args) {
        /**
         * 线程池三大方法
         * 能够同时开启的线程数
         * 1.newSingleThreadExecutor() 创建一个单一线程
         *2.newFixedThreadPool(5) 创建一个固定线程,能够同时开启5条线程
         * 3.newCachedThreadPool() 遇强则强,主机的最大同时线程开启数
         */
        //ExecutorService service01= Executors.newSingleThreadExecutor();
        //ExecutorService service02 = Executors.newFixedThreadPool(5);
        ExecutorService service03 = Executors.newCachedThreadPool();
        try {
            for (int i = 1; i <=100 ; i++) {
                //使用了线程池后,通过线程池来创建线程
                service03.execute(()-> System.out.println(Thread.currentThread().getName()+"线程创建成功"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //使用线程池,在程序结束之前要关闭线程池
            service03.shutdown();
        }
    }
}

三大方法

  • newSingleThreadExecutor() 创建一个单一线程
  • newFixedThreadPool(5) 创建一个固定线程,能够同时开启5条线程
  • newCachedThreadPool() 遇强则强,主机的最大同时线程开启数

控制线程开启的线程数

七大参数

    public ThreadPoolExecutor(int corePoolSize,//核心线程池大小
                              int maximumPoolSize,//最大核心线程池大小
                              long keepAliveTime,//超时,没有调用就会释放
                              TimeUnit unit,//超时单位
                              BlockingQueue<Runnable> workQueue,//阻塞队列
                              ThreadFactory threadFactory,//线程工厂,创建线程的,一般不用动
                              RejectedExecutionHandler handler//拒绝策略
                             6) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

四大拒绝策略

  • new ThreadPoolExecutor.AbortPolicy() //银行满了,还有人进来,不处理这个人,直接抛出异常
  • new ThreadPoolExecutor.CallerRunsPolicy()//哪来的去哪里
  • new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢到任务,不会抛出异常
  • new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了尝试和最早的线程竞争,成功进入,失败丢掉,也不会抛出异常
/** 四大拒绝策略
 *1.new ThreadPoolExecutor.AbortPolicy() //银行满了,还有人进来,不处理这个人,直接抛出异常
 *2.new ThreadPoolExecutor.CallerRunsPolicy()//哪来的去哪里
 *3.new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢到任务,不会抛出异常
 *4.new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了尝试和最早的线程竞争,成功进入,失败丢掉,也不会抛出异常
 */
public class Demo02 {
    public static void main(String[] args) {
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,
                 new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()
                );
        //最大承载数:Deque+Max
        for (int i = 1; i <=3; i++) {
          threadPool.execute(()-> {
              System.out.println(Thread.currentThread().getName()+": "+"OK");
          });
        }
       threadPool.shutdown();
    }
}

标签:队列,抛出,线程,new,public,ThreadPoolExecutor
From: https://www.cnblogs.com/wfy-studying/p/16811742.html

相关文章

  • 多线程
    多线程概念:Windows操作系统是多任务操作系统,它以进程为单位。每个独立执行的程序被称为一个进程,而每个进程又包含多个线程。系统可以分配给每个进程一段使用CPU的时间(CPU......
  • CPU密集型和IO密集型(判断最大核心线程的最大线程数)
    CPU密集型和IO密集型(判断最大核心线程的最大线程数)CPU密集型1.CPU密集型获取电脑CPU的最大核数,几核,最大线程数就是几Runtime.getRuntime().availableProcessors()--->......
  • 测试开发jmeter设置线程序号
    测试开发jmeter设置线程序号${__threadNum}需要在请求的名称后面加上${__threadNum}    然后运行结果如下: ......
  • Java四种线程池
    1,线程池的作用 线程池作用就是限制系统中执行线程的数量。 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果。 2,为什么要用线程池? (1).减少了创建......
  • .Net 线程
    一个应用程序中,必须有一个进程,一个进程可同时多个线程协作处理。同步:单线程,每一步都执行结束并返回结果,下一步处于等待,阻塞程序流异步:多线程,不需要等待执行结束,可继续执......
  • 【多线程那些事儿】如何使用C++写一个线程安全的单例模式?
    如何写一个线程安全的单例模式?单例模式的简单实现单例模式大概是流传最为广泛的设计模式之一了。一份简单的实现代码大概是下面这个样子的:classsingleton{public: s......
  • jmeter的线程组设置(转载)
      1、取样器错误后要执行的动作:继续:忽略错误,继续执行StartNextThreadLoop:忽略错误,线程当前循环终止,执行下一个循环。停止线程:当前线程停止执行,不影响其他线程......
  • 进程与线程的区别
    进程的定义  进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程......
  • java && C# 线程
     1、多个线程用到同一个资源的话,必须lock2、为了解决,在竞争的情况下,优先分配资源给A。就是A和B线程都同时在同一时刻需要资源x,然后的话也不清楚系统是具体怎样调度的。或者......
  • ue4 vlc ue5 vlc插件,方便接入rtsp、rtmp、http、m3u8视频流等,支持gpu解码、支持播放声
    和商城插件的区别本插件和商城的Multi-channelplaynetworkvideostreamsByOpenCVhighperformanceWebCamera(基于opencv开发)相比,增强了很多功能,1.添加了播放声......