Java线程池详细理解

端侧视觉赋能手游自动化:YOLOv8+NCNN实现低风险挂机与广告拦截 本文提出一种基于端侧AI的移动游戏自动化解决方案,采用YOLOv8目标检测和NCNN推理框架,结合AutoJS实现"感知-决策-执行"闭环。方案通过轻量化模型训练、多分辨率适配和行为拟态优化,解决了传统脚本的适配性和风控问题。关键技术包括:构建游戏专属数据集、模型量化优化、广告拦截和挂机功能实现,具有本地运行、安全稳定等特点,为个人开发者提供了一套完整的自动化开发框架。 阅读详情

使用

ThreadPoolExecutor表示一个线程池。Executors类则扮演着线程池工厂的角色,通过Executors可以获取特定功能的线程池

 Executors工厂创建线程池
 普通线程池
 public static ExecutorService newFixedThreadPool(int nThreads)
 public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)  //提供线程工厂进行创建线程
    该方法返回一个固定数量的线程池。该线程池中的线程数量始终不变。
    当一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务被暂时缓冲在任务队列中,待有线程空闲时,便处理任务队列中的任务

    public static ExecutorService newSingleThreadExecutor()
    public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)
          该方法返回只有一个线程的线程池。若有多余的任务被提交到该线程池,任务会被保存在一个任务队列中

    public static ExecutorService newCachedThreadPool()
            return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
          该方法返回一个可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,若有空闲线程可以复用,则会优先使用可复用的线程。
          若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务,执行完成之后返回线程池进行复用。
           看到该方法调用ThreadPoolExecutor方法创建线程池,最大创建的线程数量为Integer.MAX_VALUE,空闲线程的存活时间为60s



           普通线程池底层调用
                   public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
               参数:
                       corePoolSize:指定了线程池中的核心线程数量
                       maximumPoolSize:制定了线程池中的最大线程数量
                       keepAliveTime:当线程池数量超过corePoolSize时,多余的空闲线程的存活时间,即超过corePoolSize的空闲线程,在多长时间内会被销毁
                       unit:keepAliveTime的单位
                       workQueue:任务队列,缓存被提交但未被执行的任务
                       threadFactory:  线程工厂,用于创建线程
                      handler:拒绝策略,当提交的任务太多缓存队列已满,来不及处理时的拒绝策略


                   workQueue被提交但未执行的任务队列,它是一个BlockingQueue接口的对象,仅用于存放Runnable对象。
                   ThreadPoolExecutor类的构造函数可以使用以下几种BlockingQueue接口
                      1.直接提交的队列:该功能由SynchronousQueue提供
                         SynchronousQueue是一个特殊的BlockingQueue实现,它没有容量,每一个插入操作都要等待一个相应的删除,反之,每一个删除操作都要等待对应的插入操作。
                         不会将任务进行保存,而总是将新任务提交给线程执行,如果没有空闲线程,则尝试创建,如果数量已经达到最大值,则执行拒绝策略。因此,使用SynchronousQueue
                         队列通常要设置很大的maximumPoolSize值,否则很容易执行拒绝策略

                    2. 有界的任务队列:可以使用ArrayBlockingQueue类实现
                    ArrayBlockingQueue类的构造函数必须带一个容量参数,表示该队列的最大容量
                    public ArrayBlockingQueue(int capacity)  //构造器

                    使用有界队列时,当任务队列已满时,才会将线程数提升至corePoolSize以上,当线程数量达到maximumPoolSize时,则执行拒绝策略



                    3. 无界的任务队列
                    无界任务队列可以通过LinkedBlockingQueue类实现。


                    4.优先任务队列
                        优先任务队列是带有优先级的队列,它的实现有PriorityBlockingQueue类实现,可以控制任务的执行先后顺序。
                        它是一个特殊的无界队列。

    

调度线程池
     public static ScheduledExecutorService newSingleThreadScheduledExecutor()
     public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
              该方法返回只有一个线程的调度线程池,调度线程池在普通线程池功能上做了一些扩展,如可以固定的延时之后执行,或者周期执行

     public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
               返回一个固定数量线程的调度线程池

     调度线程池的扩展方法
       public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit)
              创建一个周期性任务。任务开始于给定的初始延时时。后续的任务按照给定的周期进行
              注:当任务执行的时间超过了调度时间时,不会出现任务堆叠的境况,即单次的调度时间为定义的调度时间和实际任务执行的时间中取最大值
              注:当任务出现未捕获的异常,则后续的所有子任务都会停止调度
        public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit)
                 创建一个周期性任务。任务开始于初始延时时间,后续任务将会按照给定的延时进行:即上一个任务的结束时间到下一个任务的开始时间的时间差

 

Demo

//固定数量的线程池
public class ThreadPoolDemo {
    private static class MyTask implements Runnable{
        @Override
        public void run() {
            System.out.println(System.currentTimeMillis() +":Thread Name:"+Thread.currentThread().getName());
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


    public static void main(String[] args) {
        MyTask task = new MyTask();
        ExecutorService es = Executors.newFixedThreadPool(5);
        for (int i = 0 ; i< 10 ; i++){
            es.submit(task);
        }
    }
}

 

public class ScheduledExecutorServiceDemo {
    public static void main(String[] args) {
        ScheduledExecutorService ses =Executors.newScheduledThreadPool(10);
        ses.scheduleAtFixedRate(() -> {
            try {
                Thread.sleep(1000);
//                Thread.sleep(8000);  //当任务执行时间超过了调度周期时间,则会按任务执行时间来调度
                System.out.println(System.currentTimeMillis()/1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },0,2, TimeUnit.SECONDS);
    }
}
PyTorch生成式人工智能——VQ-VAE详解与实现 VQ-VAE (Vector Quantised-Variational AutoEncoder) 的核心思想就是将 VAE 的连续潜变量离散化。它通过学习一个码本 (Codebook) 来实现这一点,码本是一个包含有限个嵌入向量的字典。模型不是直接输出一个连续的潜在向量,而是从码本中找出与编码器输出最接近的嵌入向量来代替它。本节首先详细讲解 VQ-VAE 的技术原理,然后使用 PyTorch 从零开始实现 VQ-VAE 模型。 阅读详情

相关推荐

LAMMPS in文件详解:从零开始手把手教你配置金属分子动力学模拟

本文详细解析了LAMMPS in文件的配置方法,手把手教你完成金属分子动力学模拟的全流程。从软件环境准备、势函数选择,到使用Materials Studio构建模型、编写in文件进行能量最小化与系统弛豫,再到实施单轴拉伸生产模拟并提取应力应变数据,最后通过Python和OVITO进行结果分析与可视化,提供了完整的实战指南和常见问题排查技巧。

weixin_28475533的博客 530

[笔记][Java7并发编程实战手册]4.3 创建固定的线程执行器newFixedThreadPool线程池

[笔记][Java7并发编程实战手册]系列目录简介 newFixedThreadPool(int nThreads, ThreadFactory threadFactory) 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程。 newCachedThreadPool()创建的线程池的特性是:自动回收不使用

代码有毒的博客 5939

RK3588开发板量产前必做:24小时DDR压力测试到底在测什么?(附ArmSoM-W3测试脚本解析)

本文深入解析RK3588开发板量产前的24小时DDR压力测试,揭示其核心价值与技术原理。通过memtester、stressapptest和变频测试的组合使用,全面验证DDR内存稳定性。特别介绍ArmSoM-W3测试脚本的创新设计,包括并行测试架构和异常熔断机制,为开发者提供可靠的量产测试方案。

weixin_30325487的博客 455

JVM常用参数解析

JVM的参数类型:其中标配参数和x参数: 用的较多的是xx参数: 运行的java进程编号显示:jps -l ; 1)boolean类型: jinfo -flag 配置项 进程编号(或jinfo -flags 进程编号):用来查看某个进程的配置(在VM options中可以加参数):+(-)PrintGCDetails表示是否打印垃圾收集细节;+(-)UseSerialGC表示是否使...

liuzewei2015的博客 503

PHP服务端 苹果支付(IAP)处理

公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。 首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。 先上图: 下面我详细的讲一下每...

山水的博客 1万+

嘉立创EDA vs Altium Designer:新手如何选择?从界面到实战全对比

本文全面对比了嘉立创EDA与Altium Designer(AD)两大PCB设计工具,从设计哲学、界面交互、封装库管理、设计规则引擎、协作功能到成本生态六大维度进行深入分析。嘉立创EDA以极简设计和云端协作为特色,适合学生和创客快速上手;而AD则凭借专业级精准控制,成为高端电子设计的行业标准。通过实战案例和详细对比表格,帮助新手根据项目需求选择合适的EDA工具。

weixin_30296405的博客 722

java虚拟线程

要注意虚拟线程并不是用来直接取代平台线程的,虚拟线程是运行在平台线程之上的,一个平台线程可以对应多个虚拟线程,同时一个平台线程还是一一对应内核线程,因此上面的架构就变成了如下,一个 VT 代表一个虚拟线程。Java 中的线程跟操作系统的内核线程是一对一的,Java 线程的调度其实是依赖操作系统的内核线程的,这就导致了我们的线程切换和运行就需要进行上下文切换以及消耗大量的系统资源。JDK 的调度器没有直接将虚拟线程分配给系统线程,而是将虚拟线程分配给平台线程(这是前面提到的虚拟线程的 M:N 调度)。

yearraey的博客 2370

Honeywell EPKS 核心功能块组态与执行调度实战解析

本文深入解析Honeywell EPKS系统的核心功能块组态与执行调度技术,涵盖控制模块(CM)、顺序控制模块(SCM)和输入输出模块(IOM)的配置方法。通过实战案例分享执行顺序(ORDERINCM)和CEE执行周期的优化策略,帮助工程师提升工业自动化系统的控制精度和运行效率。

weixin_28724319的博客 414

Android使用Thread的interrupt与sleep,重启或暂停线程任务

Android使用Thread的interrupt与sleep,重启或暂停线程任务本文给出一个例子,简单说明如何在Android诸如Activity中,重启或者暂停一个正在无限运作的线程。需求描述:假设在Android的Activity中,有一个线程,永不停息的运作,若当前Activity处于用户可见状态时候,每隔一秒输出一个自增长的计数器值,但是当Activity处于用户不可见时候,暂停线程输出

Zhang Phil 1万+

8年ES运维经验整理出的Elasticsearch运维手册(超实用)

k1 : 控制非线性词频率归一化(饱和),Elasticsearch中默认值为1.2。用人能看懂的话说就是词语在文档中出现的次数对于得分的重要性。例如说我觉得在某些场景,一个搜索词在文档中出现越多则越接近我希望搜索的内容,就可以将这个参数调大一点。b :控制文档长度对于分数的惩罚力度。变量b处于分母上,它乘以刚刚讨论过的字段长度的比值,Elasticsearch中的b 默认值为0.75。如果b较大,则文档长度相对于平均长度的影响更大。

yonggeit的博客 5278

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2668

JVM中可生成的最大Thread数量

来自:http://jzhihui.iteye.com/blog/1271122   最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个:   -Xms intial java heap size -Xmx ...

liao49的专栏 1250

大语言模型与ROS集成的自然语言机器人控制:开源框架与应用实例

近年来,大语言模型(LLM)与机器人操作系统(ROS)的集成逐步成熟,使得自然语言驱动的机器人控制成为可能。用户输入“捡起绿色方块”或“把微波炉里的饭热好端过来”这类日常语句,机器人能够自动拆解步骤、规划动作并执行。本文梳理2026年前后发布的三个代表性开源框架——ROS-LLM、ROSClaw以及LLM+Nav2基准测试系统,介绍其技术路径与工程落地情况。

Studying…… 634

理解Java - 线程池

Executors创建线程池 Executors提供几种创建线程池的方法: Executors.newScheduledThreadPool(); //定时任务线程池 Executors.newCachedThreadPool(); //可缓存的线程池 Executors.newSingleThreadExecutor(); //单个线程的线程池 Executors.newFix...

qgbihc的专栏 140

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【深入理解Java线程池】

/ 定义自定义线程工厂 ThreadFactory namedThreadFactory = new ThreadFactory() {} };// 定义自定义拒绝策略 RejectedExecutionHandler customRejectedHandler = new RejectedExecutionHandler() {} };

L-Blog 1596

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java线程池理解

1.java使用线程池的优势 线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。 2.java使用线程池的特点 线程复用;控制最大并发数;管理线程。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗。 第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会

luo1054的博客 250

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

由浅入深理解Java线程池及线程池的如何使用

由浅入深理解Java线程池及线程池的如何使用

libufan的博客 140

Java中的线程池用过吧?来说说你是怎么理解线程池吧?

前言 Java中的线程池用过吧?来说说你是怎么使用线程池的?这句话在面试过程中遇到过好几次了。我甚至这次标题都想写成【Java八股文之线程池】,但是有点太俗套了。虽然,线程池是一个已经被说烂的知识点了,但是还是要写这一篇用来加深自己的印象,但是想使用一个特殊的方式写出来。 线程池 使用线程池的目的 先说一下我们为什么要使用线程池? 线程是稀缺资源,不能频繁的创建。而且创建和销毁线程也是比较耗资源的。 为了做到解耦,线程的创建与执行任务分开,方便对线程进行维护。 为了复用,前面也说了创建和销毁线程比较耗资源

Jimoer 389

Java线程池理解

线程池原理理解作用: 线程池的作用就是限制系统中执行线程的数量。 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果; 少了浪费系统资源,多了造成系统拥挤效率不高。 用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列中取最前面的任务开始执行。 若队列中没有等待进程,线程池的这一资源处于等待。 当一个新任务需要运行时,如果线程池中有等待的工作线程

journey_fan的专栏 5369

java线程池_JAVA的那些事儿(线程池的理解和一点生活化)

今天来聊聊JAVA的线程池,然后联系上一点生活中的小常识,从而加深理解和记忆...先上图:JAVA线程池JAVA线程池结构很简单,有两个组件,一个是线程集合,一个是任务队列,线程集合里的线程不断地从队列里面获取任务来执行。为什么用这样的结构,早期的时候我们用一个 new Thread也能实现多线程。核心线程加任务队列的方案,能够消除多线程的资源消耗和线程安全问题。两者在源码里的实现一个是HashS...

weixin_39676348的博客 87

JAVA线程池理解

了解线程池

qq_42473322的博客 1295

java线程池的理解

线程池之前一定有多线程的概念,使用线程的时候就去创建一个线程如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 在Java中可以通过线程池,使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务 Executors创建线程池 Java 创建线程池的方法很简单,只需要调用Exe...

snow的博客 281

Java 线程池的实现原理,你真的理解吗?

1 线程状态 既然要说线程,我们就先来了解一下线程的几种状态: publicenumState{ NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } 如上述代码所示,其来自于java.lang.Thread类,State为Thread类的内部公共枚举类,表示线程的 6 种状态。 NEW,新建状态。尚未启动...

m0_58683072的博客 152

对线程、进程和Java线程池的理解

人生最大的悲哀,莫过于我本可以。我钻研操作系统,后选修Linux操作系统,做过父进程生子进程的作业,还做过IO多路复用、多线程的网络游戏,自认为对线程、进程的理解颇深。然,多次面试,面对面试官:“你对Java的线程池机制有所了解吗?我不由噤声。面试官再问:“你说一说进程与线程的区别。我更是大惊失色,支支吾吾,拾了一些“进程不共享资源”、“进程对应多个线程”、“线程是执行最小单位”、“一个进程至少一个线程”来答,看着面试官越来越失望的脸色,我自知面试必挂。苦也!

weixin_62411896的博客 980

Java 线程池概念理解

Java 线程池是并发编程的基石,其高效性源于对线程生命周期的精细管理和任务调度的智能决策。正确配置参数(核心线程数、队列类型、拒绝策略)需结合具体业务场景,同时通过监控和动态调整应对流量波动。进阶实践中,应注重线程命名规范化、异常处理、资源泄露防范,并合理利用 Java 8+ 的新特性提升系统性能。当任务提交到线程池时,空闲线程直接从队列中获取任务执行,避免反复创建新线程的开销。线程执行完任务后不会销毁,而是继续等待下一个任务。超时等待),实现“线程-任务”的解耦和复用。循环从队列中获取任务

笔记 1053

Java线程池初步理解

前言:在慕课网上学习剑指Java面试-Offer直通车时所做的笔记. 目录 第一章 基本概念 1.1 Fork/Join框架 1.2 为什么要使用线程池 第二章 源码理解 2.1 J.U.C的三个Executor接口 第三章 线程池的设计与实现 3.1 线程池的构造函数 3.2 线程池的执行步骤 3.3 线程池的状态 3.4 生命周期与线程池大小选定 第一章 基本概念 ...

仰望星空 387
上一篇: Java CyclicBarrier使用
下一篇: Java NIO之Buffer详细理解
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值