创建线程池的方法_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;
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 怎样更改pycharm的项目默认保存路径_vscode怎么给python导入包

    怎样更改pycharm的项目默认保存路径_vscode怎么给python导入包 参考原文:https://blog.csdn.net/yggaoeecs/article/details/78378938  还有这篇,同时讲了anaconda的安装:https://blog.csdn.net/qq_29883591/article/details/78077244https://blog.csdn.net/qq_29883591/article/details/78…

  • ES7学习笔记(十三)GEO位置搜索

    ES7学习笔记(十三)GEO位置搜索

    2020年11月14日
  • pycharm2018激活码 pycharm激活码_软件一键无痕看怎么使用的

    pycharm2018激活码 pycharm激活码_软件一键无痕看怎么使用的PyCharm激活码最新破解教程,Mac版激活至2299年,PyCharm激活码2021.3.3

  • Linux系统管理—linux计划任务和日志的管理

    Linux系统管理—linux计划任务和日志的管理一、计划任务-at-cron-计划任务使用方法计划任务的作用:是做一些周期性的任务,在生产中的主要用来定期备份数据CROND:这个守护进程是为了周期性执行任务或处理等待事件而存在计划任务的安排方式分两种:一种是定时性的,也就是例行。就是每隔一定的周期就要重复来做这个事情一种是突发性的,就是这次做完了这个事,就没有下一次了,临时决定,只执行一次的任务at和crontab这两个命令:at:它是一个可以处理仅执行一次就结束的指令crontab:它是会把你指定的工

  • 工业超纯水机:EDI超纯水设备技术介绍

    EDI超纯水设备技术是国际上20世纪90年代开始逐渐发展起来的新型纯水、超纯水制备技术。该技术巧妙地将电渗析技术和离子交换技术相融合,通过阴、阳离子的选择性透过作用与离子交换树脂对离子的交换作用,在直流电场的作用下实现离子的定向迁移,从而完成水的深度除盐,同事水电离解产生的氢离子和氧根离子对离子交换树脂进行再生,因此不需酸碱化学再生而能连续制取超纯水。  EDI设备特点  EDI系统运

  • Dreamweaver8的安装

    Dreamweaver8的安装安装步骤:Step1:双击<Dreamweaver8-chs>Step2:单击<下一步>Step3:选中<我接受该许可证协议中的条款>,单击<下一步>按钮Step4:选中<在桌面上创建快捷方式(针对所有用户)>,单击<下一步>Step5:单击<下一步>S…

发表回复

您的电子邮箱地址不会被公开。

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