多线程编程

  • 定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
    • Executors的方式创建定长线程池(不推荐容易,容易内存溢出OOM)
    • ThreadPoolExecutor构造函数创建定长线程池(推荐)

定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

当我们在开发大屏的时候一个各大平会返回多个接口每个接口返回速度都不一样,会导致有的模块加载出来,有的模块未加载出来,用这种定长的线程方式,用一个接口返回,使全部模块统一加载,这样不仅能提高客户使用的感官,也可以大大提升前端开发效率

Executors的方式创建定长线程池(不推荐容易,容易内存溢出OOM)

package org.data.source.controller;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @auther :zby* @date :2022/1/22 10:27*/
@RestController
@RequestMapping("/test")
public class TestFixedThreadPoolController {//创建线程池ExecutorService exe = Executors.newFixedThreadPool(3);@RequestMapping("/FixedThreadPool")public String test(){Future<String> s1 = exe.submit(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("执行了1");return "1";}});Future<String> s2 = exe.submit(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("执行了2");return "2";}});Future<String> s3 = exe.submit(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("执行了3");return "3";}});//无返回值,接口返回了不,此方法继续执行直至结束exe.execute(new Runnable() {//execute执行任务,自动调用run方法@Overridepublic void run() {try {TimeUnit.MILLISECONDS.sleep(50000); //睡50000毫秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("执行了无返回值");}});String result = null;try {return s1.get()+s2.get()+s3.get();}catch (Exception e){result =  "error";}return result;}
}

ThreadPoolExecutor构造函数创建定长线程池(推荐)

package org.data.source.controller;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @auther :zby* @date :2022/1/22 11:09*/
@RestController
@RequestMapping("/test")
public class TestFixedThreadPoolNewController {/*** 使用ThreadPoolExecutor创建线程池* 传入线程数等于最大线程数* @param nThreads* @return*/public static ExecutorService newFixedThreadPool(int nThreads) {/***corePoolSize(第一个nThreads):指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;maximumPoolSize(第二个nThreads):指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;keepAliveTime:当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁;unit:keepAliveTime的单位;workQueue:任务队列;*/return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}//创建个线程ExecutorService exe = newFixedThreadPool(4);@RequestMapping("/FixedThreadPoolNew")public String test(){Future<String> s1 = exe.submit(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("执行了1");return "1";}});Future<String> s2 = exe.submit(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("执行了2");return "2";}});Future<String> s3 = exe.submit(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("执行了3");return "3";}});//无返回值,接口返回了不,此方法继续执行直至结束exe.execute(new Runnable() {//execute执行任务,自动调用run方法@Overridepublic void run() {try {TimeUnit.MILLISECONDS.sleep(50000); //睡50000毫秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("执行了无返回值");}});String result = null;try {return s1.get()+s2.get()+s3.get();}catch (Exception e){result =  "error";}return result;}}

多线程编程定长线程池相关推荐

  1. 多线程编程学习笔记——线程池(二)

    接上文 多线程编程学习笔记--线程池(一) 三.线程池与并行度 此示例是学习如何应用线程池实现大量的操作,及与创建大量线程进行工作的区别. 1. 代码如下 using System; using Sy ...

  2. JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里说线程池的分类 有可缓存类型, 定长类型, 定时类型, 单例类型, 这里我这次用Executo ...

  3. 高并发编程基础(线程池基础)

    线程池简单基础介绍: Executor: Executor是Java工具类,执行提交给它的Runnable任务.该接口提供了一种基于任务运行机制的任务提交方法,包括线程使用详细信息,时序等等.Exec ...

  4. Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现

    为什么需要线程池 我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口.但是我们创建这两种线程在运行结束后都会被 ...

  5. Java多线程详解(线程池)

    嗨喽-小伙伴们我来了, 上一章我们介绍了Java中的Thread类里一些常用的方法.本节我们就来聊一聊线程池. 说到"池",大家或许都不陌生,在java中,我们有见过数据库连接池, ...

  6. Java多线程知识点整理(线程池)

    2019独角兽企业重金招聘Python工程师标准>>> 1.线程池的使用 线程池一般配合队列一起工作,是线程池限制并发处理任务的数量.然后设置队列的大小,当任务超过队列大小时,通过一 ...

  7. 【转】1.2异步编程:使用线程池管理线程

    从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个"主题".即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程.现在我为 ...

  8. 异步编程:使用线程池管理线程

    开始<异步编程:使用线程池管理线程> 示例程序:异步编程:使用线程池管理线程.rar 如今的应用程序越来越复杂,我们常常需要使用<异步编程:线程概述及使用>中提到的多线程技术来 ...

  9. 【高并发内存池】第一篇:定长内存池设计

    文章目录 一. 什么是内存池? 1. 池化技术 2. 内存池概念 二. 为什么要有内存池? 1. 内存碎片问题 2. 内存池带来的好处 三. 定长内存池设计 1. 定长内存池特点 2. 定长内存池基本 ...

最新文章

  1. pandas使用isna函数和any函数检查dataframe是否包含缺失值、整体是否有缺失值,不区分行列(check if dataframe contains any missing values
  2. android应用课程设计报告,基于Android的多媒体播放器课程设计报告.doc
  3. 解决PHP大文件上传问题
  4. Unity 4.3 2D 教程:新手上路
  5. Spark不是唯一,三种新兴的开源数据分析工具
  6. java小编程----括号是否匹配
  7. 别了!Python之父!
  8. php接口 含义,php晋级必备:一文读懂php接口特点和使用!
  9. eclipse 启动服务后,部署的文件一直是旧的文件的原因分析
  10. auto_ptr自动资源管理器
  11. 使用案例_Excel中LOOKUP函数的使用案例
  12. A very hard mathematic problem HDU - 4282
  13. vnc远程,在windows下如何实现vnc远程
  14. python打开qq并登录_python爬虫入门之qq登陆初探
  15. 考研政治|马克思主义基本原理
  16. 一键清除系统垃圾文件的bat批处理命令
  17. 线性代数 --- 用内积重新定义矩阵的转置(个人学习笔记)
  18. 光电池和光电二极管的区别
  19. 【智能优化算法】蚁群算法ACO
  20. tiny6410刷机教程

热门文章

  1. 虚拟服务器怎么导入ova,云服务器导入ova
  2. 汽车手机智能控制一键启动智能钥匙开发
  3. 免费舆情监控工具有哪些,TOOM加强舆情监控提高应对能力
  4. 人类行为时空特性的统计力学(一)——认识幂律分布
  5. STM32入门:STM32F1系列关于TIM2-TIM7的时钟频率问题
  6. outlook 2016 选项里 签名 无设置 点击无反应(和outlook2013相同)
  7. 在red hat中安装yum
  8. 为何要用征信约束员工跳槽?
  9. Ins风格简单干净房间Mac高清动态壁纸
  10. 微信PC端无法拖入文件