版权声明:ApassionBoy https://blog.csdn.net/weixin_43150581/article/details/83990254
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 block
e.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);
}
}
好啦,今天的分享就到这里喔!
记得点一个赞哦,你的赞是小编成功的第一步