创建线程池的方法_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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图形推理1000题pdf_【3分钟模考】图形推理06组「建议收藏」

    图形推理1000题pdf_【3分钟模考】图形推理06组「建议收藏」考点遍历小模考(图形推理005组)平均错误率:36.1%4题对3题达标1.从所给四个选项中,选择最合适的一个,使之呈现一定规律性:2.要求你从四个图形中把与众不同的挑出来。3.4.左边给定的是纸盒的外表面,下面哪一项能由它折叠而成?答案解析第1题【答案】B【解析】本题属于位置类,主要考查数三角形。题干图形中,重叠数三角形个数依次为1、2、3、4、5,应选有6个…

    2025年10月10日
    5
  • 论文笔记之STN_论文笔记软件

    论文笔记之STN_论文笔记软件这篇文章是15年谷歌DeepMind团队推出的一个可以学习一种变换,这种变换可以将进行了仿射变换的目标进行矫正的网络——SpatialTransformerNetwork(STN)。STN具有空间不变性特点,也就是说STN可以使图片经过各种变换后的识别效果和未变换前的识别效果保持不变。Note:空间不变性:旋转、平移、缩放、裁剪不变性。传统的池化方式(MaxPooling/AveragePooling)所带来卷积网络的位移不变性和旋转不变性只是局部的和固定的(池化的大小一般都很小,比如3×.

    2022年10月19日
    5
  • 西安市住房购房意向登记平台网址「建议收藏」

    西安市住房购房意向登记平台网址「建议收藏」西安市住房购房意向登记平台网址:http://124.115.228.93/zfrgdjpt/index.html

    2022年8月3日
    5
  • ROS中启动超声波雷达节点「建议收藏」

    ROS中启动超声波雷达节点「建议收藏」超声波雷达型号为KS136,KS136使用I2C接口与主机通信,自动响应主机的I2C控制指令。指令为8位数据,指令发送流程如下,先接收I2C控制指令,寄存器2接收控制指令,选择超声波探头号(因为主控板接12个收发一体式防水探头,每个探头独立工作,每个探头占据8位地址,分别对应8种不同的数据收发方式),流程图如下所示:超声波与主控之间通过串口通信代码如下: r…

    2025年9月7日
    7
  • 截取示波器网络图片[通俗易懂]

    截取示波器网络图片[通俗易懂]■问题由来手边有一台相对比较古老的Tektronix的示波器TDS3054D示波器,四通道的。它可以通过联网获得波形的图片。对于记录观察到的波形相对比较方便。▲示波器及其联网获得屏幕图片在截取示波器波形窗口的过程中,由于上面出现红色的字体(HOME:TDS3054BAA(192.168.0.101))的影响,经常使得截取图片出现不完整,因此希望通过软件(PYTHON程序)自动完成精细截取的过程。▲截取示波器波形窗口TDS3054B的显示模式包括两种:普通显示模式:示波器的

    2022年10月12日
    4
  • yk87cn一键视频神器ios_codename cure

    yk87cn一键视频神器ios_codename cure变量命名神器-Codelf在某度上搜索codeif得到的首个搜索结果:http://codeif.xinke.org.cn/点击链接进去后,输入名称回车后网页并无任何反应,不知道是不是服务器端出现问题了。后来搜索了一下,得到一个外网地址:https://unbug.github.io/codelf实测这个地址网页可以使用。…

    2022年9月21日
    2

发表回复

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

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