Java基础-多线程&JUC-线程池和自定义线程池

这篇具有很好参考价值的文章主要介绍了Java基础-多线程&JUC-线程池和自定义线程池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 线程池

Java基础-多线程&JUC-线程池和自定义线程池,JavaSE,java,开发语言

主要核心原理

Java基础-多线程&JUC-线程池和自定义线程池,JavaSE,java,开发语言

不推荐Executors创建没有上线的线程池,建议使用自定义的线程池;
Java工具类创建线程池;

Java基础-多线程&JUC-线程池和自定义线程池,JavaSE,java,开发语言

public class demo16 {
    public static void main(String[] args) {
        /**
         * public static ExecutorService newCachedThreadPoo1() 创建个没有上限的线程池
         * public static ExecutorService newFixedThreadPool (int nThreads) 创有上限的线程池
         */
        //1. 获取线程池对象
        //ExecutorService pool1 = Executors.newCachedThreadPool();
        ExecutorService pool1 = Executors.newFixedThreadPool(3);

        //2. 提交任务
        pool1.submit(new MyRunnable16());
        pool1.submit(new MyRunnable16());
        pool1.submit(new MyRunnable16());
        pool1.submit(new MyRunnable16());


        //3. 销毁线程池
        //pool1.shutdown();
    }
}
class MyRunnable16 implements Runnable {

    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + "---" + i);
        }
    }
}

2. 自定义线程池

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

Java基础-多线程&JUC-线程池和自定义线程池,JavaSE,java,开发语言

  1. 当只有3个任务时,直接上处理机运行;
  2. 当有6个任务时,任务1-3上处理机运行,任务4-6进入阻塞队列等待;
  3. 当有9个任务时,任务1-3上处理机运行,任务4-6进入阻塞队列等待,任务7-9由3个临时线程处理运行;
  4. 当有10个任务时,任务1-3上处理机运行,任务4-6进入阻塞队列等待,任务7-9由3个临时线程处理运行,任务10触发任务拒接策略(此时核心线程和临时线程均在工作,且阻塞队列已满);

Java基础-多线程&JUC-线程池和自定义线程池,JavaSE,java,开发语言

任务拒接策略

Java基础-多线程&JUC-线程池和自定义线程池,JavaSE,java,开发语言

示例代码:

public class poolDemo1 {
    public static void main(String[] args) {
        /**
         * ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor
         * (核心线程数量,最大线程数量,空闲线程最大存活时间,任务队列,创建线程工厂,任务的拒绝策略);
         * 参数一:核心线程数且   不能小于0
         * 参数二:最大线程数    不能小于等于0,最大数量 >= 核心线程数量
         * 参数三:空闲线程最大存活时间   不能小于0
         * 参数四:时间单位     用TimeUnit指定
         * 参数五:任务队列     不能为nu11
         * 参数六:创建线程工厂       不能为nu11
         * 参数七:任务的拒绝策略      不能为nu11
         */
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                3,
                6,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        // 开9个任务,观察输出结果比较明显
        threadPoolExecutor.submit(new MypoolRunnable());
        threadPoolExecutor.submit(new MypoolRunnable());
        threadPoolExecutor.submit(new MypoolRunnable());
        threadPoolExecutor.submit(new MypoolRunnable());
        threadPoolExecutor.submit(new MypoolRunnable());
        threadPoolExecutor.submit(new MypoolRunnable());
        threadPoolExecutor.submit(new MypoolRunnable());
        threadPoolExecutor.submit(new MypoolRunnable());
        threadPoolExecutor.submit(new MypoolRunnable());
    }
}
class MypoolRunnable implements Runnable {

    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + "---" + i);
        }
    }
}

自定义的线程池应该多大?

首先给出最大并行数,该cpu是10核16线程,最大并行数应该是16;
Java基础-多线程&JUC-线程池和自定义线程池,JavaSE,java,开发语言

或者可以在idea中输出下面代码,也可以得到最大最大并行数;

System.out.println(Runtime.getRuntime().availableProcessors());

根据程序的类型,考虑cpu和I/O利用率

Java基础-多线程&JUC-线程池和自定义线程池,JavaSE,java,开发语言文章来源地址https://www.toymoban.com/news/detail-528292.html

到了这里,关于Java基础-多线程&JUC-线程池和自定义线程池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java多线程(3)---锁策略、CAS和JUC

    目录 前言 一.锁策略 1.1乐观锁和悲观锁 ⭐ 两者的概念 ⭐实现方法 1.2读写锁  ⭐概念 ⭐实现方法 1.3重量级锁和轻量级锁 1.4自旋锁和挂起等待锁 ⭐概念 ⭐代码实现 1.5公平锁和非公平锁 1.6可重入锁和不可重入锁 二.CAS 2.1为什么需要CAS 2.2CAS是什么 ⭐CAS的介绍 ⭐CAS工作原理

    2024年02月13日
    浏览(38)
  • Java导出PDF文档(模板导出和自定义)

    需要导出PDF文档,支持模板导出和自定义文档格式。 PDF模板创建可使用表单域创建表单字段,引入数据填充,或者根据实际需要生成html转换成pdf。 PDF模板可以考虑使用PDF编辑器编辑,创建表单域,配置好相应字段      

    2024年02月16日
    浏览(36)
  • 【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类

    目录 1、JUC(java.util.concurrent) 1.1、Callable 接口 1.2、ReentrantLock 可重入锁 1.3、Semaphore 信号量 1.4、CountDownLatch 这是java中的一个包,存放着 多线程编程 中常见的一些类。 【Java多线程】Thread类的基本用法-CSDN博客 https://blog.csdn.net/zzzzzhxxx/article/details/136121421?spm=1001.2014.3001.5501 往

    2024年04月10日
    浏览(74)
  • Java - JUC(java.util.concurrent)包详解,其下的锁、安全集合类、线程池相关、线程创建相关和线程辅助类、阻塞队列

    JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题 java.lang.Thread.State tools(工具类):又叫信号量三组工具类,包含有 CountDownLatch(闭锁) 是一个同步辅助类,在完成一组正在其他线程中

    2024年02月05日
    浏览(29)
  • Unity对象池和自写对象池

    目录 一. 什么是对象池 二、创建对象池 1、Stack ①Stack类 1构造函数 2属性 3方法 ②Stack对象池 2、Queue ①Queue类 1构造函数 2属性 3方法 ②Queue对象池 3.Unity官方对象池 ①Object Pool类 1构造函数 2属性 3方法 ②Object Pool对象池 一. 什么是对象池 顾名思义就是一定数量的已经创建好的

    2024年01月21日
    浏览(25)
  • 【Java|多线程与高并发】JUC中常用的类和接口

    JUC是Java并发编程中的一个重要模块,全称为 Java Util Concurrent (Java并发工具包),它提供了一组用于多线程编程的工具类和框架,帮助开发者更方便地编写线程安全的并发代码。 本文主要介绍 Java Util Concurrent 下的一些常用接口和类 Callable接口类似于Runnable. 有一点区别就是

    2024年02月12日
    浏览(25)
  • 【JavaEE】JUC(java.util.concurrent)的常见类以及线程安全的集合类

    目录 1、JUC(java.util.concurrent)的常见类 1.1、Callable接口的用法(创建线程的一种写法)  1.2、ReentrantLock可重入互斥锁 1.2.1、ReentrantLock和synchronized的区别  1.2.2、如何选择使用哪个锁 1.3、Semaphore信号量 1.4、CountDownLatch  2、线程安全的集合类 2.1、多线程环境使用ArrayList  2.2、

    2024年02月07日
    浏览(37)
  • Java实现钉钉企业内部应用机器和自定义机器人发送消息

     公司让写一个服务监控的功能,当监测到服务停止时,向钉钉群里推送报警信息。之前大概看到钉钉的开放平台的API文档,好像能群发消息的只有机器人。 钉钉开放平台目前提供三种机器人: 企业内部应用机器人 群模板机器人 自定义机器人 本来向用自己比较熟悉的自定义

    2024年02月12日
    浏览(38)
  • Java调用ChatGPT(基于SpringBoot和Vue)实现连续对话、流式输出和自定义baseUrl

    源码及更详细的介绍说明参见Git上的 README.md 文档 https://github.com/asleepyfish/chatgpt 本文Demo(SpringBoot和Main方法Demo均包括)的Git地址:https://github.com/asleepyfish/chatgpt-demo 流式输出结合Vue前端的Demo的Git地址:https://github.com/asleepyfish/chatgpt-vue 后续使用方法和api版本更新均在Github的READM

    2024年02月16日
    浏览(26)
  • 【JavaSE】Java基础语法(十八):接口

    接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。 Java中接口存在的两个意义 用来定义规范 用来做功能的拓展 接口用interface修饰 类实现接口用implements表示 接口不能实例化 我们可以创建接口的实现类对象使用 接口的子类 要么重写接口中的所有抽

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包