ExecutorService

今天小编要分享的是关于线程池,

想必接触到并发处理的朋友都有用到线程池,

当我们访问服务器的量达到服务器一定量的时候,

比如几百万几千万,很容易造成服务器崩掉,

如果使用线程进行并发处理,将使用的线程进行回收在使用,就减小了服务器的压力

下面写一个例子介绍线程池的使用方法:


package com.dstech.market.service.impl;import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;import javax.annotation.PostConstruct;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;import com.dstech.dssp.base.annotation.MethodParameter;
import com.dstech.dssp.comp.bomf.manager.BomfManager;
import com.dstech.dssp.service.BasicBeanService;
import com.dstech.market.bean.DsDocInfo;
import com.dstech.market.service.DsDocInfoService;/**
* DsDocInfoServiceImpl.java
*/
@Component("marketDsDocInfoService")
@DependsOn({"bomfManager"})
public class DsDocInfoServiceImpl  extends BasicBeanService<DsDocInfo> implements DsDocInfoService {//log
private static Logger log=LoggerFactory.getLogger(DsDocInfoServiceImpl.class);
//创建线程池
private static  ExecutorService newCachedThreadPool =newFixedThreadPool1(10);
//wx7e3c48ae7772ee10  wx3f465fb88215de20
@Override
public Class<?> getType() {return DsDocInfoService.class;
}/*** 初始化*/
@PostConstruct
public void init(){BomfManager.getInstance().addApi(this);
}/*** 查询*/
@Override
@MethodParameter(desc="DsInfoQuery", input="Id",postType={},postName="",queryString="",httpMethod="get")
public List<DsDocInfo> DsInfoQuery(String Id) throws Exception {List<DsDocInfo> dicInfo=this.getBeanDaoHelper().queryWhere(DsDocInfo.class, "doc_id=?", new Object[]{Id}, null);return dicInfo;
}/*** 线程池* newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程; * newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待; * newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行; * newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行; **/
@Override
@MethodParameter(desc="dsquery", input="Id",postType={},postName="",queryString="",httpMethod="get")
public List<DsDocInfo> dsquery(final String Id) throws Exception {for (int i = 0; i <20; i++){newCachedThreadPool.execute(new Runnable(){public void run() {try {System.out.println("线程名称为:"+Thread.currentThread().getName());System.out.println("线程Id为:"+Thread.currentThread().getId());//休眠时间0.2秒Thread.sleep(200);try {//调用查询方法List<DsDocInfo> list=DsInfoQuery(Id);if(list!=null&&list.size()>0){for (DsDocInfo dsDocInfo : list) {System.out.println("文档Id:"+dsDocInfo.getDocId()+"\t创建人:"+dsDocInfo.getCreatePerson());}}} catch(Exception e){//TODO Auto-generated catch blocke.printStackTrace();}} catch(InterruptedException e){e.printStackTrace();}}});}return null;
}/*** 以下是对线程池的设置* @Title: newCachedThreadPool * @Description: TODO* @param @param nThreads* @param @return * @return ExecutorService* @throws*/
public static ExecutorService newCachedThreadPool(int nThreads){//5:核心池大小,  5:最大池大小,60L:保活时间,SECONDS秒//return new ThreadPoolExecutor(nThreads,nThreads, 60L,TimeUnit.SECONDS, new SynchronousQueue<Runnable>());return new ThreadPoolExecutor(nThreads,Integer.MAX_VALUE,1L,TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
}
public static ExecutorService newFixedThreadPool(int nThreads){  //nThreads核心池大小 ,nThreads最大池大小,0L,保活时间,MILLISECOND毫秒return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());}public static ExecutorService newFixedThreadPool1(int nThreads){return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory){return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(), threadFactory);
}}

好啦,今天的分享就到这里喔!

记得点一个赞哦,你的赞是小编成功的第一步

如何在JAVA中创建线程池相关推荐

  1. JAVA中创建线程池的五种方法及比较

    之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...

  2. 多线程线程池的实现java_如何在Java中实现线程池

    多线程线程池的实现java 线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或 ...

  3. 如何在Java中实现线程池

    线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或多个线程.在多线程中,每个任 ...

  4. 如何在java中实现线程_用代码说话:如何在Java中实现线程

    并发编程是Java语言的重要特性之一,"如何在Java中实现线程"是学习并发编程的入门知识,也是Java工程师面试必备的基础知识.本文从线程说起,然后用代码说明如何在Java中实现 ...

  5. 万字图文 | 学会Java中的线程池,这一篇也许就够了!

    来源:一枝花算不算浪漫 线程池原理思维导图.png 前言 Java中的线程池已经不是什么神秘的技术了,相信在看的读者在项目中也都有使用过.关于线程池的文章也是数不胜数,我们站在巨人的肩膀上来再次梳理一 ...

  6. 【多线程和并发】Java中的线程池的实现原理

    Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行的程序都可以使用线程池. 合理使用线程池能带来三个好处: 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗: 提 ...

  7. 如何在Java中创建一个新的List

    本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...

  8. 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  9. idea中java文件怎么运行_Java入门基础篇-如何在Java中创建只读文件

    本文选自千锋教育<Java语言程序设计>,如需转载请注明出处,谢谢! 1.如何创建只读文件 要使文件只读,我们只要将文件属性更改为只读就行:可以使用File类的setReadOnly()方 ...

最新文章

  1. 边缘检测、Hough变换、轮廓提取、种子填充、轮廓跟踪
  2. 还在用 Random生成随机数?试试 ThreadLocalRandom,超好用!
  3. linux 面包店 多进程,Linux下的多进程编程(一)
  4. php加超链接不显示不出来,如何将图片作为超链接 我制作了添加超链接的图片,但是图片怎么在浏览器显示不出来呢?...
  5. 浙江省第二届大学生网络与信息安全竞赛在线预赛
  6. 昨日万圣节ABAP怪兽级代码谜团,公布答案啦
  7. JavaScript from C#(入门篇)
  8. C语言运算符的优先级及结合性
  9. 19.内在摄像机校准——介绍,理想与真实固有参数之比,改善内在参数_1
  10. java编码规范日常积累(持续更新)
  11. Python办公自动化(一):从Word到Excel
  12. 自定义标签的使用jsp实例_JSP自定义标签示例教程
  13. 从0开始学习 GitHub 系列之「团队合作利器 Branch」
  14. 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
  15. windows10-seaslog安装笔记
  16. 大众奥迪车 UDS协议ECU的诊断
  17. 极客时间-算法训练营 3.2
  18. 但行好事 莫问前程(五月)
  19. matlab能输入铁心参数,变压器铁心剩磁预测研究
  20. 集群服务器上的jupyter配置

热门文章

  1. PIC18F26K40 芯片Flash读写函数
  2. java基础03(基本语法)
  3. 目标检测YOLO系列算法的进化史
  4. 航测倾斜摄影如何用Smart3D(ContextCapture)处理大疆无人机照片生成三维模型
  5. python中request获取数据,Python 中request数据的获取
  6. linux awk命令根据分隔符输出,Linux运维知识之Linux awk命令详解
  7. 3G手机视频对讲开发包
  8. 数商云采购管理系统解决方案丨让企业与供应商高效协同
  9. 用Python实现对表格中某一列所有数据加减乘除
  10. Gitee(码云)使用Git