IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java 线程池 -> 正文阅读

[Java知识库]java 线程池

我们为什么使用线程池

首先我们使用new Thread()方法进行创建线程主要时间花销包括创建时间,执行时间,线程切换,销毁时间,当我们整个程序有大量的进程需要我们处理,没有个新的线程都需要这些重复的时间花销,但是我们为什么不在系统一起动就实现准备若干个线程,从而创建和销毁的时间就省去了. 由此我们引入我们的线程池的优势

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

corePoolSize

整个线程池核心线程数 也可以理解为整个线程最小保持线程的个数,这个数值最好保持在与CPU核心数保持一直可以通过 Runtime.getRuntime().availableProcessors()方法进行获得

maximumPoolSize

线程池中最大线程数
当我们使用excetore(Runable)提交新任务的时候,即使已有若干空线程,单线程数小于corePoollSize也会创建新的线程来执行提交的任务.

当提交新任务线程数已经大于corePoolSize小于maximumPoolSize但阻塞队列未满不会创建新的线程,而是把线程放入阻塞队列,仅当队列已满才会创建新的线程

通过将corePoollSizemaximumPoolSize设置为相等会创建一个固定大小的线程池,后期可以通过使用setCorePoolSizesetMaximumPoolSize动态更改。

keepAliveTime

当空闲的线程数大于corePoolSize且时间超过keepAliveTime时会进行销毁多余的空闲线程

unit

keepAliveTime的时间单位

workQueue

阻塞队列,当阻塞队列不为空的时候可以使用方法prestartCoreThreadprestartAllCoreThreads预先启动队列中的线程。

线程排队策略:
直接交接(SynchronousQueue) 阻塞队列中只有一个容量,相当于任务直接交付给工作线程,当一直提交任务时因为队列已满就会一直创建新的线程,当线程数等于maximumPoolSize时线程池会启动拒绝策略
无界队列(LinkBlockingQueue,没有容量得链表阻塞队列),当提交任务数大于corePoolSize但是由于是无界队列,队列长度会一直增加下去也会不创建新的线程,

有界队列(ArrayBlockingQueue)可以防止一直创建线程做成内存泄漏,当线程数等于maximumPoolSize时线程池会启动拒绝策略

threadFactory

通过提供不同的 ThreadFactory,您可以更改线程的名称、线程组、优先级、守护程序状态等。

例如

class MyThreadFactory extends AtomicLong implements ThreadFactory
    {
        @Override
        public Thread newThread(Runnable r)
        {
            Thread t = new Thread(r, "我是线程的妈妈 "+incrementAndGet());
            t.setDaemon(true);//设置成守护线程
            return t;
        }
    }

什么是守护线程
线程分为用户线程,守护线程,守护线程会一直守着用户线程,当用户线程全部结束用户线程也会自动结束,因为没有需要守护的先程了,守护线程也就没必要存在了.

handler

拒绝策略:

AbortPolicy()直接抛出异常):当提交新任务时队列已满也没有工作线程能够接纳时直接抛出异常
CallerRunsPolicy(谁提交的谁运行):当提交新任务时队列已满也没有工作线程能够接纳时谁提交的谁运行新任务
DiscardPolicy(直接抛弃新的任务):当提交新任务时队列已满也没有工作线程能够接纳时直接抛弃新提交的任务
DiscardOldestPolicy(直接抛弃旧任务):当提交新任务时队列已满也没有工作线程能够接纳时直接抛弃队列中最早提交的任务(舍弃队头任务)

使用方法

ArrayBlockingQueue<Runnable> blockQueue = new ArrayBlockingQueue<Runnable>(10);
        blockQueue.add(new WorkThread(1 + ""));
        blockQueue.add(new WorkThread(2 + ""));
        blockQueue.add(new WorkThread(3 + ""));
        int coreSize = Runtime.getRuntime().availableProcessors();
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(coreSize, coreSize + 10, 2, TimeUnit.MINUTES, blockQueue,new MyThreadFactory() );

        threadPool.prestartAllCoreThreads();
    }

    class MyThreadFactory extends AtomicLong implements ThreadFactory
    {
        @Override
        public Thread newThread(Runnable r)
        {
            Thread t = new Thread(r, "我是线程的妈妈 "+incrementAndGet());
            t.setDaemon(true);
            return t;
        }
    }
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:35:37  更:2022-03-21 20:37:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:56:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码