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


相关推荐

  • PHP实现各种经典算法

    PHP实现各种经典算法

    2022年2月23日
    35
  • 软件测试面试笔试题及答案(软件测试题库)

    1、软件测试的流程2、web测试和APP测试的区别仅仅从功能测试的层面上来讲的话,在流程和功能测试上是没有区别的。那么区别在哪里呢?由于载体不一样,所以系统测试和一些细节可能会不一样。那么我们就要先来了解,web和app的区别。web项目,一般都是b/s架构,基于浏览器的,而app则是c/s的,必须要有客户端。那么在系统测试测试的时候就会产生区别了。首先从系统架构来看的话,web测试…

    2022年4月13日
    248
  • SQL Server 2008 示例库 AdventureWorks2008R2[通俗易懂]

    SQL Server 2008 示例库 AdventureWorks2008R2[通俗易懂]求AdventureWorks2008R2和AdventureWorksDW2008R2的下载地址图片:

    2022年9月11日
    0
  • scsa笔记1

    scsa笔记1常见的网络安全术语0day通常是指还没有补丁的漏洞。也就是说官方还没有发现或者是发现了还没有开发出安全补丁的漏洞exploit简称exp,漏洞利用APT攻击高级持续性威胁。利用先进的攻击手段对特定目标进行长期持续性网络攻击的攻击形式1.1信息安全脆弱性及常见安全攻击网络环境的开放性在这里插入图片描述协议栈的脆弱性及常见攻击截获嗅探(sniffing)监听(eavesdropping)篡改数据包篡改(tampering)中断拒绝服务(dosing)伪造欺骗(spoof

    2022年6月20日
    37
  • 大数据技术包括哪些内容?

    大数据技术包括哪些内容?关于大数据的概念,指的是无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。而大数据技术,是指从各种各样类型的数据中,快速获得有价值信息的能力。那么关于大数据的技术大致包含哪些内容?第一,数据采集ETL工具负责将分布的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后进行清洗、转换、集成,最后加载到数据仓库或数据集市中,成为联机分析处理、数据挖掘的基础。…

    2022年6月5日
    50
  • grahphics_blitz

    grahphics_blitz1.前言Graphics的Blit方法是比较简单也是比较常用的方法。最简单的作用是将一张纹理绘制到另一张纹理中。而在此方法中可以指定一种材质来实现特殊的效果,所以常和OnRenderImage方法配

    2022年8月5日
    3

发表回复

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

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