Java中的线程池

2023-07-04 Fast-Lio论文中公式(6)与BCH公式中近似雅可比公式的一致性推导 将(1)式代入(6)式,就有。 阅读详情

线程池的作用:

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

 

为什么要用线程池:

  1. 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
  2. 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

线程池类

    

Java代码  收藏代码
package com.tdt.impl.ls;  
import java.util.LinkedList;  
/** 
 * @project LocationGateway 
 * @author sunnylocus    
 * @verson 1.0.0 
 * @date   Aug 2, 2008 
 * @jdk    1.4.2 
 */  
public class ThreadPool extends ThreadGroup {  
private boolean isClosed = false;  //线程池是否关闭   
  1.     private LinkedList workQueue;      //工作队列  
  2.     private static int threadPoolID = 1;  //线程池的id  
  3.     public ThreadPool(int poolSize) {  //poolSize 表示线程池中的工作线程的数量  
  4.   
  5.         super(threadPoolID + "");      //指定ThreadGroup的名称  
  6.         setDaemon(true);               //继承到的方法,设置是否守护线程池  
  7.         workQueue = new LinkedList();  //创建工作队列  
  8.         for(int i = 0; i < poolSize; i++) {  
  9.             new WorkThread(i).start();   //创建并启动工作线程,线程池数量是多少就创建多少个工作线程  
  10.         }  
  11.     }  
  12.       
  13.     /** 向工作队列中加入一个新任务,由工作线程去执行该任务*/  
  14.     public synchronized void execute(Runnable task) {  
  15.         if(isClosed) {  
  16.             throw new IllegalStateException();  
  17.         }  
  18.         if(task != null) {  
  19.             workQueue.add(task);//向队列中加入一个任务  
  20.             notify();           //唤醒一个正在getTask()方法中待任务的工作线程  
  21.         }  
  22.     }  
  23.       
  24.     /** 从工作队列中取出一个任务,工作线程会调用此方法*/  
  25.     private synchronized Runnable getTask(int threadid) throws InterruptedException {  
  26.         while(workQueue.size() == 0) {  
  27.             if(isClosed) return null;  
  28.             System.out.println("工作线程"+threadid+"等待任务...");  
  29.             wait();             //如果工作队列中没有任务,就等待任务  
  30.         }  
  31.         System.out.println("工作线程"+threadid+"开始执行任务...");  
  32.         return (Runnable) workQueue.removeFirst(); //反回队列中第一个元素,并从队列中删除  
  33.     }  
  34.       
  35.     /** 关闭线程池 */  
  36.     public synchronized void closePool() {  
  37.         if(! isClosed) {  
  38.             waitFinish();        //等待工作线程执行完毕  
  39.             isClosed = true;  
  40.             workQueue.clear();  //清空工作队列  
  41.             interrupt();        //中断线程池中的所有的工作线程,此方法继承自ThreadGroup类  
  42.         }  
  43.     }  
  44.       
  45.     /** 等待工作线程把所有任务执行完毕*/  
  46.     public void waitFinish() {  
  47.         synchronized (this) {  
  48.             isClosed = true;  
  49.             notifyAll();            //唤醒所有还在getTask()方法中等待任务的工作线程  
  50.         }  
  51.         Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。  
  52.         int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类,根据活动线程的估计值获得线程组中当前所有活动的工作线程  
  53.         for(int i =0; i < count; i++) { //等待所有工作线程结束  
  54.             try {  
  55.                 threads[i].join();  //等待工作线程结束  
  56.             }catch(InterruptedException ex) {  
  57.                 ex.printStackTrace();  
  58.             }  
  59.         }  
  60.     }  
  61.   
  62.     /** 
  63.      * 内部类,工作线程,负责从工作队列中取出任务,并执行 
  64.      * @author sunnylocus 
  65.      */  
  66.     private class WorkThread extends Thread {  
  67.         private int id;  
  68.         public WorkThread(int id) {  
  69.             //父类构造方法,将线程加入到当前ThreadPool线程组中  
  70.             super(ThreadPool.this,id+"");  
  71.             this.id =id;  
  72.         }  
  73.         public void run() {  
  74.             while(! isInterrupted()) {  //isInterrupted()方法继承自Thread类,判断线程是否被中断  
  75.                 Runnable task = null;  
  76.                 try {  
  77.                     task = getTask(id);     //取出任务  
  78.                 }catch(InterruptedException ex) {  
  79.                     ex.printStackTrace();  
  80.                 }  
  81.                 //如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程  
  82.                 if(task == null) return;  
  83.                   
  84.                 try {  
  85.                     task.run();  //运行任务  
  86.                 }catch(Throwable t) {  
  87.                     t.printStackTrace();  
  88.                 }  
  89.             }//  end while  
  90.         }//  end run  
  91.     }// end workThread  
  92. }  

 

2.测试类

  

Java代码  收藏代码
  1. package com.tdt.test;  
  2.   
  3. import com.tdt.impl.ls.ThreadPool;  
  4.   
  5. public class ThreadPoolTest {  
  6.       
  7.     public static void main(String[] args) throws InterruptedException {  
  8.         ThreadPool threadPool = new ThreadPool(3); //创建一个有个3工作线程的线程池  
  9.         Thread.sleep(500); //休眠500毫秒,以便让线程池中的工作线程全部运行  
  10.         //运行任务  
  11.         for (int i = 0; i <=5 ; i++) { //创建6个任务  
  12.             threadPool.execute(createTask(i));  
  13.         }  
  14.         threadPool.waitFinish(); //等待所有任务执行完毕  
  15.         threadPool.closePool(); //关闭线程池  
  16.   
  17.     }  
  18.   
  19.     private static Runnable createTask(final int taskID) {  
  20.         return new Runnable() {  
  21.             public void run() {  
  22.             //  System.out.println("Task" + taskID + "开始");  
  23.                 System.out.println("Hello world");  
  24.             //  System.out.println("Task" + taskID + "结束");  
  25.             }  
  26.         };  
  27.     }  
  28. }  

 

 

结果:

Java代码  收藏代码
  1. 工作线程0等待任务...  
  2. 工作线程1等待任务...  
  3. 工作线程2等待任务...  
  4.   
  5. 工作线程0开始执行任务...  
  6. Hello world  
  7. 工作线程0等待任务...  
  8.   
  9. 工作线程1开始执行任务...  
  10. Hello world  
  11. 工作线程1等待任务...  
  12.   
  13. 工作线程2开始执行任务...  
  14. Hello world  
  15. 工作线程2等待任务...  
  16.   
  17. 工作线程0开始执行任务...  
  18. Hello world  
  19. 工作线程0等待任务...  
  20.   
  21. 工作线程1开始执行任务...  
  22. Hello world  
  23. 工作线程1等待任务...  
  24.   
  25. 工作线程2开始执行任务...  
  26. Hello world  
  27. 工作线程2等待任务...  

 

Unity URP管线下的Highlight Plus插件,从导入到实现物体高亮的保姆级避坑指南 本文详细解析了在Unity URP管线中使用Highlight Plus插件实现物体高亮的完整流程与常见问题解决方案。从URP环境配置、插件导入避坑到相机设置优化,提供了一套完整的保姆级指南,帮助开发者高效解决高亮效果不显示等典型问题,并包含移动端性能优化与复杂场景管理的高级技巧。 阅读详情

相关推荐

普冉PY32F003定时器实战:从HSE时钟配置到500ms精准闪烁LED(附完整代码)

本文详细解析了普冉PY32F003单片机定时器的实战应用,从HSE时钟配置到实现500ms精准LED闪烁。通过完整的代码示例和深入的技术分析,帮助开发者掌握定时器参数计算、中断优先级管理及调试技巧,适用于各类嵌入式开发项目。

weixin_30608503的博客 451

java线程池(简单易懂)

它最长的构造方法有七个参数。 核心线程数量——在线程池当中无论空闲多久都不会被删除的线程 线程池当中最大的线程数量——线程池当中最大能创建的线程数量 空闲时间(数值)——临时线程(线程池中出核心线程之外的线程)空闲了多久就会被淘汰的时间。 空闲时间(单位)——临时线程空闲了多久就会被淘汰的时间单位,要用枚举类TimeUnit类作为参数 阻塞队列——就是创建一个阻塞队列作为参数传入,就是当线程池当中线程数量已经达到了最大线程数量,允许多少个任务排队获取线程,其余的用参数七那个方案来处理。

qq_64680177的博客 9611

国产PLC实战:用汇川Easy320搞定TCP通信,手把手教你网口转串口控制设备

本文详细解析了如何使用汇川Easy320 PLC实现TCP通信与串口控制,解决工业自动化中设备间通信协议差异问题。通过实战案例和代码示例,展示了Easy320在协议转换、数据解析和串口转发中的高效应用,帮助工程师快速掌握网口转串口控制技术。

weixin_31774841的博客 500

【Java多线程进阶】线程池详解

本文讲解:Java 如何创建线程池,以及线程池底层的类,线程池的四个拒绝策略,模拟实现线程池。

我的主页 4739

【工具使用】Keil常用的调试操作整理介绍

2、当选择了非0级优化时,调试可能会变得困难,具体表现在断点调试。该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的置。:如果是在C语言窗口中,则是按单条语句执行,与单步调试不同的是,遇到函数不会进入函数内部,而是直接全速运行函数,并跳到下一条语句。但我的Keil软件中无法显示这个视图,并且通过修改系统试图,调试时,点击打开系统视图发生了闪退的现象,目前能想到的原因是:重新安装Keil,安装最新版本。

MEYOU_Cc 不吃香菜! 1万+

第 10 篇:深度学习的“军火库”——CNN、RNN与Transformer,AI如何看懂世界?

深度学习的革命,不是依赖单一的通用大脑,而是为不同任务打造了专属“军火库”:CNN用“局部感知”看懂图像,RNN用“循环记忆”理解序列,而Transformer则用“全局注意力”开启了AIGC时代。理解这些架构,不是记忆孤立的技术,而是洞察AI从“专才”走向“通才”的进化脉络。

maqh_csdn的博客 786

线程池的4种创建方式

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后再创建线程后启动这些任务。线程池都是后台线程,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元。如果某个线程再托管代码中空闲 (如正在等待某事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超出最大值得线程可以排队,但他们要等待其它线程完成后才启动。

不积跬步,无以至千里 5804

【Jenkins】Jenkins :首次登录直接使用 admin 账户

目录 一、使用admin账户 二、修改admin用户密码 三、管理视图 一、使用admin账户 安装时,自定义安装,选择必要的插件安装,设置Jenkins的URL为: http://本机或服务器IP:8080 然后在创建第一个管理者界面,直接选择:使用admin 二、修改admin用户密码 进入:系统管理——管理用户——选中用户——点击设置图标——修改密码: 三、...

顾三殇 —— 博客空间(软件测试) 1万+

【Java】线程池

线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗。在JAVA中主要是使用ThreadPoolExecutor类来创建线程池,并且JDK中也提供了Executors工厂类来创建线程池(不推荐使用)。线程池的优点降低资源消耗,复用已创建的线程来降低创建和销毁线程的消耗。提高响应速度,任务到达时,可以不需要等待线程的创建立即执行。提高线程的可管理性。

daydayup 1788

机器人控制基础:伺服驱动电机 PID 参数自适应控制的实现方法及研究

伺服电机PID参数自适应控制技术研究 摘要:针对伺服驱动电机在动态负载工况下传统PID控制性能下降的问题,本文研究了多种自适应控制方法。通过分析6种主流技术(包括模型参考自适应、模糊逻辑、神经网络等)的原理、实现步骤及适用场景,揭示了负载感知精度、参数调节实时性和系统稳定性三大技术难点,并提出了相应解决方案。以模糊自适应PID为例的实验验证表明,该技术能有效提升伺服系统在变负载条件下的控制性能。研究为工业应用中伺服电机的精确控制提供了重要参考。

start_up_go的博客 828

[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望

杨秀璋的专栏 2万+

JAVA线程池详解

最全java线程池详解,看这一篇就够了...

ZHANGLIZENG的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JAVA中的线程池

1、什么是池化技术? 池化技术 (Pool) 是一种很常见的编程技巧,在请求量大时能明显优化应用性能,降低系统频繁建连的资源开销。我们日常工作中常见的有数据库连接池、线程池、对象池等,它们的特点都是将 “昂贵的”、“费时的” 的资源维护在一个特定的 “池子” 中,规定其最小连接数、最大连接数、阻塞队列等配置,方便进行统一管理和复用,通常还会附带一些探活机制、强制回收、监控一类的配套功能。 简介 **提前保存大量的资源,以备不时之需以及重复使用。**池化技术应用广泛,如内存池,线程池,连接池等等。内存池相关的

qq_55627064的博客 757

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java中的几种线程池

new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); new Thread的弊端如下: a. 每次new Thread新建对象性能差。 b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 c. 缺乏更多功能,如定时执行、定期执行、线程中断。 相比new Thread,Java提供的四种线程池的好处在于:

weixin_44997869的博客 589

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JAVA中的线程池说明一

线程池是一种管理线程的机制,它预先创建一定数量的线程,并将它们放入一个池中。当需要执行任务时,线程池会从池中选择一个空闲的线程来执行任务,而不是每次都创建新的线程。一旦任务完成,线程会被归还到线程池中,等待下一次使用。在之前我们也了解过,相关的池化技术,字符串常量池,数据库连接池,HTTP连接池等,池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池的主要优点包括:提高性能,降低资源消耗。

m0_62055442的博客 2094

Java中的线程池详解

FixedThreadPool会创建一个固定大小的线程池,当有新任务提交时,如果线程池中空闲线程数量小于设定的核心线程数,则会创建新线程;SingleThreadExecutor会使用单个工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行,并且在任意时间内,线程池中只能有一个线程在工作。在Java中,线程池是一种管理和复用线程的机制,它能够有效地控制并发线程数量,提高系统性能和资源利用率。使用线程池可以避免反复创建和销毁线程的开销,同时能够管理大量并发请求。

聚娃科技开发者博客 413

java中的线程池

线程池

2302_80683230的博客 998

关于Java中的线程池

慢慢来看😊,这段代码中,意思是线程来了先去找核心线程,如果核心满了,看是否小于最大线程数,小于的话,为了实现快速消费的目的,就直接失败,大于最大线程数的话,就说明当前要处理的线程比较多,就都放入阻塞队列慢慢消费。简单来讲就是先找核心线程数,如果核心线程数满了,就进去阻塞队列,等着来找核心线程,如果队列都满了,那就使用非核心线程来处理,如果都超过最大线程数了,就使用拒绝策略具体处理。那看一下线程池消费的过程,有个排队去找核心线程数的过程,这个排队就造成时间浪费了。完美,总的来说,不是很难💕💕💕。

Reische的博客 393

Java 并发编程中的线程池

在『任务调度线程池』功能加入之前,可以使用 java.util.Timer 来实现定时功能,Timer 的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务。如果阻塞队列也满了,就会交给救急线程运行,当救急线程运行完了就会结束,但是核心线程会一直执行,不会结束(即使没有任务)。自己创建一个单线程串行执行任务,如果任务执行失败而终止那么没有任何补救措施,而线程池还会新建一个线程,保证池的正常工作。

xiongyuqing的博客 919
上一篇: Java中的位移运算符
下一篇: Java生成PDF
八阿哥别走
博客等级 码龄16年 8粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值