如何在JAVA中创建线程池
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中创建线程池相关推荐
- JAVA中创建线程池的五种方法及比较
之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...
- 多线程线程池的实现java_如何在Java中实现线程池
多线程线程池的实现java 线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或 ...
- 如何在Java中实现线程池
线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或多个线程.在多线程中,每个任 ...
- 如何在java中实现线程_用代码说话:如何在Java中实现线程
并发编程是Java语言的重要特性之一,"如何在Java中实现线程"是学习并发编程的入门知识,也是Java工程师面试必备的基础知识.本文从线程说起,然后用代码说明如何在Java中实现 ...
- 万字图文 | 学会Java中的线程池,这一篇也许就够了!
来源:一枝花算不算浪漫 线程池原理思维导图.png 前言 Java中的线程池已经不是什么神秘的技术了,相信在看的读者在项目中也都有使用过.关于线程池的文章也是数不胜数,我们站在巨人的肩膀上来再次梳理一 ...
- 【多线程和并发】Java中的线程池的实现原理
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行的程序都可以使用线程池. 合理使用线程池能带来三个好处: 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗: 提 ...
- 如何在Java中创建一个新的List
本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...
- 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)
@Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...
- idea中java文件怎么运行_Java入门基础篇-如何在Java中创建只读文件
本文选自千锋教育<Java语言程序设计>,如需转载请注明出处,谢谢! 1.如何创建只读文件 要使文件只读,我们只要将文件属性更改为只读就行:可以使用File类的setReadOnly()方 ...
最新文章
- 边缘检测、Hough变换、轮廓提取、种子填充、轮廓跟踪
- 还在用 Random生成随机数?试试 ThreadLocalRandom,超好用!
- linux 面包店 多进程,Linux下的多进程编程(一)
- php加超链接不显示不出来,如何将图片作为超链接 我制作了添加超链接的图片,但是图片怎么在浏览器显示不出来呢?...
- 浙江省第二届大学生网络与信息安全竞赛在线预赛
- 昨日万圣节ABAP怪兽级代码谜团,公布答案啦
- JavaScript from C#(入门篇)
- C语言运算符的优先级及结合性
- 19.内在摄像机校准——介绍,理想与真实固有参数之比,改善内在参数_1
- java编码规范日常积累(持续更新)
- Python办公自动化(一):从Word到Excel
- 自定义标签的使用jsp实例_JSP自定义标签示例教程
- 从0开始学习 GitHub 系列之「团队合作利器 Branch」
- 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
- windows10-seaslog安装笔记
- 大众奥迪车 UDS协议ECU的诊断
- 极客时间-算法训练营 3.2
- 但行好事 莫问前程(五月)
- matlab能输入铁心参数,变压器铁心剩磁预测研究
- 集群服务器上的jupyter配置