Java中线程池ExecutorService详细

java中线程池ExecutorService 线程管理 代码:   package com.bob.test;   import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;   public class ExecutorServiceTest { static void run(Execu... 阅读详情

代码如下:

package threadPool;

import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;  
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
  
public class ExecutorDemo {  
      
   private static void run(ExecutorService threadPool) {  
    for(int i = 1; i < 5; i++) {    
            final int taskID = i;    
            threadPool.execute(new Runnable() {    
                @Override  
        public void run() {    
                    for(int i = 1; i < 5; i++) {    
                        try {    
                            Thread.sleep(20);// 为了测试出效果,让每次任务执行都需要一定时间    
                        } catch (InterruptedException e) {    
                            e.printStackTrace();    
                        }    
                        System.err.println("第" + taskID + "次任务的第" + i + "次执行");    
                    }    
                }    
            });    
        }    
        threadPool.shutdown();// 任务执行完毕,关闭线程池    
   }  
      
    public static void main(String[] args) {  
        // 创建可以容纳3个线程的线程池  
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  
          
        // 线程池的大小会根据执行的任务数动态分配  
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
          
        // 创建单个线程的线程池,如果当前线程在执行任务时突然中断,则会创建一个新的线程替代它继续执行任务    
        ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();  
          
        // 效果类似于Timer定时器  
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);  
          
        run(fixedThreadPool);  
        /*
         * 在FixedThreadPool中,有一个固定大小的池。
         * 如果当前需要执行的任务超过池大小,那么多出的任务处于等待状态,直到有空闲下来的线程执行任务,
         * 如果当前需要执行的任务小于池大小,空闲的线程也不会去销毁。
         * 
         * 总结:
         * 创建了一个固定大小的线程池,容量为3,然后循环执行了4个任务。由输出结果可以看到,前3个任务首先执行完,然后空闲下来的线程去执行第4个任务.
         */
       // run(cachedThreadPool);
        /*
         * CachedThreadPool会创建一个缓存区,将初始化的线程缓存起来。会终止并且从缓存中移除已有60秒未被使用的线程。
         *如果线程有可用的,就使用之前创建好的线程,
         *如果线程没有可用的,就新创建线程。
         * 
         * 总结:
         * 4个任务是交替执行的。
         */
      //run(singleThreadPool); 
      /*
       * SingleThreadExecutor得到的是一个单个的线程,这个线程会保证你的任务执行完成。
       * 如果当前线程意外终止,会创建一个新线程继续执行任务,这和我们直接创建线程不同,也和newFixedThreadPool(1)不同。
       * 
       * 总结:
       * 4个任务是顺序执行的。
       */
     // run(scheduledThreadPool);  
      /*
       * ScheduledThreadPool是一个固定大小的线程池,与FixedThreadPool类似,执行的任务是定时执行。
       * 
       * 总结:
       * 运行结果与fixedThreadPool一致
       */
    }  
  
}  


CachedThreadPool

CachedThreadPool会创建一个缓存区,将初始化的线程缓存起来。会终止并且从缓存中移除已有60秒未被使用的线程。
如果线程有可用的,就使用之前创建好的线程,
如果线程没有可用的,就新创建线程。
重用:缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse;如果没有,就建一个新的线程加入池中
使用场景:缓存型池子通常用于执行一些生存期很短的异步型任务,因此在一些面向连接的daemon型SERVER中用得不多。
超时:能reuse的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。
结束:注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。

 // 线程池的大小会根据执行的任务数动态分配  
   
    public static ExecutorService newCachedThreadPool() {  
        return new ThreadPoolExecutor(0,                 //core pool size  
                                      Integer.MAX_VALUE, //maximum pool size  
                                      60L,               //keep alive time  
                                      TimeUnit.SECONDS,  
                                      new SynchronousQueue<Runnable>());  
    }  

执行结果:
第1次任务的第1次执行  
第4次任务的第1次执行  
第3次任务的第1次执行  
第2次任务的第1次执行  
第3次任务的第2次执行  
第4次任务的第2次执行  
第2次任务的第2次执行  
第1次任务的第2次执行  
第2次任务的第3次执行  
第4次任务的第3次执行  
第3次任务的第3次执行  
第1次任务的第3次执行  
第2次任务的第4次执行  
第1次任务的第4次执行  
第3次任务的第4次执行  
第4次任务的第4次执行  
4个任务是交替执行的。

FixedThreadPool

在FixedThreadPool中,有一个固定大小的池。
如果当前需要执行的任务超过池大小,那么多出的任务处于等待状态,直到有空闲下来的线程执行任务,
如果当前需要执行的任务小于池大小,空闲的线程也不会去销毁。

重用:fixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程
固定数目:其独特之处在于,任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子
超时:和cacheThreadPool不同,FixedThreadPool没有IDLE机制(可能也有,但既然文档没提,肯定非常长,类似依赖上层的TCP或UDP IDLE机制之类的),
使用场景:所以FixedThreadPool多数针对一些很稳定很固定的正规并发线程,多用于服务器
源码分析:从方法的源代码看,cache池和fixed 池调用的是同一个底层池,只不过参数不同:
fixed池线程数固定,并且是0秒IDLE(无IDLE)
cache池线程数支持0-Integer.MAX_VALUE(显然完全没考虑主机的资源承受能力),60秒IDLE

//创建可以容纳3个线程的线程池
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

执行结果:

第2次任务的第1次执行
第3次任务的第1次执行
第1次任务的第1次执行
第3次任务的第2次执行
第1次任务的第2次执行
第2次任务的第2次执行
第3次任务的第3次执行
第2次任务的第3次执行
第1次任务的第3次执行
第3次任务的第4次执行
第1次任务的第4次执行
第2次任务的第4次执行
第4次任务的第1次执行
第4次任务的第2次执行
第4次任务的第3次执行
第4次任务的第4次执行
创建了一个固定大小的线程池,容量为3,然后循环执行了4个任务。由输出结果可以看到,前3个任务首先执行完,然后空闲下来的线程去执行第4个任务。

SingleThreadExecutor 
SingleThreadExecutor得到的是一个单个的线程,这个线程会保证你的任务执行完成。
如果当前线程意外终止,会创建一个新线程继续执行任务,这和我们直接创建线程不同,也和newFixedThreadPool(1)不同。

// 创建单个线程的线程池,如果当前线程在执行任务时突然中断,则会创建一个新的线程替代它继续执行任务    
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();  
 
public static ExecutorService newSingleThreadExecutor() {  
        return new FinalizableDelegatedExecutorService  
            (new ThreadPoolExecutor(1,  //core pool size  
                                    1,  //maximum pool size  
                                    0L, //keep alive time  
                                    TimeUnit.MILLISECONDS,  
                                    new LinkedBlockingQueue<Runnable>()));  
}  

执行结果:
第1次任务的第1次执行  
第1次任务的第2次执行  
第1次任务的第3次执行  
第1次任务的第4次执行  
第2次任务的第1次执行  
第2次任务的第2次执行  
第2次任务的第3次执行  
第2次任务的第4次执行  
第3次任务的第1次执行  
第3次任务的第2次执行  
第3次任务的第3次执行  
第3次任务的第4次执行  
第4次任务的第1次执行  
第4次任务的第2次执行  
第4次任务的第3次执行  
第4次任务的第4次执行 

4个任务是顺序执行的。

ScheduledThreadPool
ScheduledThreadPool是一个固定大小的线程池,与FixedThreadPool类似,执行的任务是定时执行。
// 效果类似于Timer定时器  
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);  
  
public ScheduledThreadPoolExecutor(int corePoolSize) {  
        super(corePoolSize,      //core pool size  
              Integer.MAX_VALUE, //maximum pool size  
              0,                 //keep alive time  
              TimeUnit.NANOSECONDS,  
              new DelayedWorkQueue());  
}  

执行结果:
第1次任务的第1次执行  
第2次任务的第1次执行  
第3次任务的第1次执行  
第2次任务的第2次执行  
第1次任务的第2次执行  
第3次任务的第2次执行  
第2次任务的第3次执行  
第1次任务的第3次执行  
第3次任务的第3次执行  
第2次任务的第4次执行  
第1次任务的第4次执行  
第3次任务的第4次执行  
第4次任务的第1次执行  
第4次任务的第2次执行  
第4次任务的第3次执行  
第4次任务的第4次执行  

细心的同学已经发现这几种都调用了ThreadPoolExecutor方法,这是Java自带的线程池构造方法
详解如下:

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

corePoolSize: 线程池维护线程的最少线程数,也是核心线程数,包括空闲线程
maximumPoolSize: 线程池维护线程的最大线程数
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略

当一个任务通过execute(Runnable)方法欲添加到线程池时:
1、 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
2、 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
3、如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
4、 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
5、 当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

这样一来我们上面的代码例子,可以直接用ThreadPoolExecutor来实现
代码如下:


import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class ExecutorDemo2 {


	private static void run(ExecutorService threadPool) {
		for (int i = 1; i < 5; i++) {
			final int taskID = i;
			threadPool.execute(new Runnable() {
				@Override
				public void run() {
					for (int i = 1; i < 5; i++) {
						try {
							Thread.sleep(20);// 为了测试出效果,让每次任务执行都需要一定时间
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						System.err.println("第" + taskID + "次任务的第" + i + "次执行");
					}
				}
			});
		}
		threadPool.shutdown();// 任务执行完毕,关闭线程池
	}


	public static void main(String[] args) {
     // 创建可以容纳3个线程的线程池
		//等同于 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  
		ThreadPoolExecutor fixedThreadPool = new ThreadPoolExecutor(3, 3,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());
		/*线程池维护线程的最少线程数,也是核心线程数,包括空闲线程 为3
		 线程池维护线程的最大线程数  为3
		 线程池维护线程所允许的空闲时间  0L
		 程池维护线程所允许的空闲时间的单位 :TimeUnit.MILLISECONDS,
		 线程池所使用的缓冲队列  new LinkedBlockingQueue<Runnable>()*/
		
    // 线程池的大小会根据执行的任务数动态分配  
        //等同于 ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
		ThreadPoolExecutor cachedThreadPool = new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>());
		
		//创建单个线程的线程池
		ThreadPoolExecutor singleThreadPool = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());
		//虽然 执行结果 与ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();一致,
		//但如果当前线程在执行任务时突然中断,应该不会创建一个新的线程替代它继续执行任务 (个人猜测,希望有人看到能指导一二)
	
		/*ThreadPoolExecutor scheduledThreadPool = new ThreadPoolExecutor(3, Integer.MAX_VALUE, 
				0, TimeUnit.NANOSECONDS,
	             new DelayedWorkQueue());*  
	             DelayedWorkQueue()  
	           点到最后面 可以看到如下:
	    private static class DelayedWorkQueue
        extends AbstractCollection<Runnable>
        implements BlockingQueue<Runnable> {........}*/
		
		//run(fixedThreadPool); 
		
		//run(cachedThreadPool);
		
		run(singleThreadPool); 


	}
}


本文写的比较匆促,如有不足之点,希望大家指出.
参考文章地址:
http://www.cnblogs.com/freemanabc/p/5618159.html
http://blog.youkuaiyun.com/vking_wang/article/details/9619137


Java 线程池ExecutorService详解及实例代码 主要介绍了Java 线程池ExecutorService详解及实例代码的相关资料,线程池减少在创建和销毁线程上所花的时间以及系统资源的开销.如果不使用线程池,有可能造成系统创建大量线程而导致消耗系统内存以及”过度切换“ 立即下载

相关推荐

小土堆学习笔记1:Dataset类代码实践

上一页中反复提到“类”,这究竟是什么东西?按我的理解(肯定不准确也不正式),class类就是某一个东西的共性,而且是等待被确认的共性。比如每台手机都有它自己的品牌、框架、价格等等属性,class类正是这些尚不确定的属性;而一旦确认了这些属性,就能够确认这到底是一台什么型号什么状态的手机,在确认了全部属性后就知道,这是一台Apple 16 Pro Max。抽象的不确定的共性就是类,具体的确定的个性就是示例。这个共性可以被用于多个编程目的,只不过某一个具体的编程行为还有它自己的独特性。

qq_40525602的博客 1626

ExecutorService详解

前言         在我们的日常开发中,难免会使用到线程,部分还会用到多线程并发问题。我们知道,线程的创建和释放,需要占用不小的内存和资源。如果每次需要使用线程时,都new 一个Thread的话,难免会造成资源的浪费,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。不利于扩展,比如如定时执行、定期执行、线程中断,所以很有必要了解下ExecutorService的使用。 ...

文韬武略的专栏 8万+

openstack卷分离异常问题处理

对于 2023-05-10 之后的所有 OpenStack 版本,需要将Nova 配置为向 Cinder 发送服务令牌,然后 Cinder 接收该令牌。cinder.conf处添加service_token_role配置。1.修改nova的config文件添加如下配置。确定service role 是否存在。有关详细信息,请参阅。重启nova cinder 服务。nova-compute日志。cinder-api日志。

weixin_43391291的博客 477

02_java内置线程池(ExecutorService)

java内置线程池(ExecutorService)

w7635122886的博客 774

桑基图实战指南:Excel/Python/R三工具高效绘制方法

桑基图是一种以线条宽度编码流量大小、以节点位置表达流程阶段、以连接关系呈现数据流向的专项可视化技术,其核心原理在于‘宽即量、位即序、连即逻辑’。它并非装饰性图表,而是面向业务诊断的分析前置工具,尤其适用于预算分配、能源损耗、用户转化等存在明确单向流动与显著数值差异的场景。相比传统柱状图或漏斗图,桑基图能天然暴露系统瓶颈与隐性损耗,大幅提升决策效率。本文聚焦工程落地,覆盖Excel插件快速交付、Python Plotly交互开发、R networkD3生态集成三大主流路径,兼顾数据准备铁律、索引映射规范与中文

cuml0912的博客 488

浙大数值分析lab2

最可怕的一道题,题目是这样的 Root of a Polynomial A polynomial of degree nnn has the common form as p(x)=cnxn+cn−1xn−1+⋯+c1x+c0p(x)=c_n x^n + c_{n-1} x^{n-1} + \cdots + c_1 x + c_0p(x)=c​n​​x​n​​+c​n−1​​x​

yao_zou的博客 4796

ExecutorService 的理解与使用

ExecutorService其中一个线程池的接口,因为安卓系统对内存的要求特别高,所以当我要异步调用一些耗时线程成就可能会开好几条,这样很容易造成OOM。所以我每个APP在创建之前就会在BaseActivity加入自定义类的对象AsyncTaskExecutor 来控制线程的数量。代码如下: public class AsyncTaskExecutor { private static As

xxdw1992的博客 1844

Python与Wind量化接口实战:从配置到数据提取全流程解析

本文详细解析了Python与Wind量化接口的实战应用,从环境配置到数据提取全流程。通过Anaconda管理Python环境,安装WindPy接口,实现历史行情、截面数据和实时行情的查询与优化。文章还提供了高级功能如批量查询、数据缓存策略及实战案例,帮助开发者高效构建量化分析框架。

omega的博客 1327

线程池的使用

这里的最小线程数量即corePoolSize。当前线程数达到corePoolSize后, 如果继续有任务被提交到线程池,会将任务缓存到工作队列(后面会介绍), 如果工作队列也满了, 则会创建一个新线程来处理, 线程池不会无限制的去创建新线程, 它会有一个最大线程数量的限制, 这个数量由maximunPoolSize指定。当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,该如何处理呢。创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等。

qq_24099547的博客 4417

数据仓库从明细到汇总:DWD与DWS层建模实战指南

DWS层的“主题”是指业务分析的核心场景,通常分为“用户主题、商品主题、订单主题、营销主题”等。主题的定义需紧密结合业务需求,避免“为了汇总而汇总”。例如,电商平台的核心业务需求包括“用户活跃度分析”“商品销售情况分析”“订单转化分析”,对应的DWS层主题即可定义为“用户主题汇总表”“商品主题汇总表”“订单主题汇总表”。主题定义时需注意“粒度适中”——汇总粒度既不能过细(否则与DWD层重复,失去汇总意义),也不能过粗(否则无法满足细分分析需求)。

2401_83088008的博客 644

从 VS Code 登录 ABAP Destination,一次把前后端连接跑通

最近很多 ABAP 开发者开始把 VS Code 纳入日常开发环境,原因很直接,VS Code 的轻量体验、命令面板、文件树、插件生态和 AI 编程能力,已经深深影响了现代开发者的工作方式。SAP 官方发布的 ABAP Development Tools for VS Code,也把 ABAP Cloud 开发模型带进了这个编辑器里。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 226

工厂类Executors三种静态方法详解

public static ExecutorService newSingleThreadExecutor() public static ExecutorService newFixedThreadPool(int nThreads) public static ExecutorService newCachedThreadPool() newSingleThreadExecutor 基本相当于...

蓝斌星的博客 575

YOLOv11改进 | Mamba-YOLOv11-L:基于SSM的高效全局建模,精度与效率的双重突破

摘要: 本文提出Mamba-YOLOv11-L,通过集成状态空间模型(SSM)改进YOLOv11的全局建模能力。针对YOLOv11在复杂场景中全局依赖缺失、精度-效率矛盾等问题,SSM以$O(N)$计算复杂度实现长程语义捕捉。改进后的模型在工业缺陷检测(Recall↑12%)、边缘设备部署(内存↓16%)、多尺度目标检测(小目标mAP↑9%)等场景表现优异,推理速度保持>40 FPS。核心创新包括轻量化SSM模块设计(稀疏状态转移+局部上下文融合)及与YOLOv11骨干的深度集成,代码实现展示了SSM

走向CTO的路上... 566

java excutorthread_Java中线程池,你真的会用吗?ExecutorService ThreadPoolExcutor

在《深入源码分析Java线程池的实现原理》这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理。在文中有这样一段描述:可以通过Executors静态工厂构建线程池,但一般不建议这样使用。关于这个问题,在那篇文章中并没有深入的展开。作者之所以这么说,是因为这种创建线程池的方式有很大的隐患,稍有不慎就有可能导致线上故障,如:一次Java线程池误用引发的血案和总结(https://zhuan...

weixin_33321740的博客 163

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

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

重温JAVA线程池精髓:Executor、ExecutorService及Executors的源码剖析与应用指南

在Java并发编程中,线程池是一个非常重要的概念。它可以帮助我们更好地管理和控制线程的使用,避免因为大量线程的创建和销毁带来的性能开销。Java的java.util.concurrent(简称JUC)包中提供了一套丰富的线程池工具,包括Executor接口、ExecutorService接口以及Executors工厂类等。本文将详细介绍这些工具的使用和原理,帮助大家更好地理解和应用Java中的线程池技术

码到三十五 3920

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java中线程池

java中线程池

zhouguizhi 817

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

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

Java线程池 ExecutorService

本篇主要涉及到的是java.util.concurrent包中的ExecutorService。ExecutorService就是Java中对线程池的实现。 一、ExecutorService介绍 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义...

weixin_33918114的博客 1553

java中线程池相关的类_Java线程池相关类-Executor框架

1.Executor接口源码:public interface Executor {/*** Executes the given command at some time in the future. The command* may execute in a new thread, in a pooled thread, or in the calling* thread, at the d...

weixin_35599815的博客 133

Java Executor、Executors、ExecutorService、ThreadPoolExecutor

一、Executors 方法 描述 ExecutorService newSingleThreadExecutor() 是一个单线程的 Executor,它创建单个工作者线程来执行任务,如果这个线程异常结束,会创建另一个线程来替代。并且能确保依照任务在队列中的顺序来串行执行(例如FIFO、LIFO,优先级)。 ExecutorService newSingleThreadExe...

书香水墨 262

JAVA系列:ExecutorService的使用方法

目录 创建ExecutorService 关闭执行服务对象 获取任务的执行的返回值 创建ExecutorService ExecutorService实际上是一个线程池的管理工具: ExecutorService executorService = Executors.newCachedThreadPool(); ExecutorService executorService = Executors.newFixedThreadPool(3);...

NIO4444 1076

Java线程池 ExecutorService了解一下

本篇主要涉及到的是java.util.concurrent包中的ExecutorService。ExecutorService就是Java中对线程池的实现。 一、ExecutorService介绍 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法: Java API对Exe...

diaoshu2256的博客 123

JAVA-线程--线程池ExecutorService 接口的说明和使用实例

JAVA-线程–线程池ExecutorService 接口的说明和使用实例 1. 说明: 调用工厂类Executors来创建线程池,创建的线程池有四种:newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool: 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 **newScheduledThreadPool :**创建一个定长线程池,支持定时及周期性任务执行。 newS

飞扬晴雪 515

java 线程池 hash_Java实战001-线程池ExecutorService

线程池ExecutorService一. new Thread的弊端执行一个异步任务你还只是如下new Thread吗?new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub}}).start();那你就太out了,new Thread的弊端如下:每次new Thread新建...

weixin_35651612的博客 199
上一篇: Java中遍历Map的四种方法
下一篇: java中从高德地图爬取数据
Java_wucao
博客等级 码龄11年 272粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java_wucao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值