簡單線程池開啟線程


線程池:

serviceimpl 層進行調用:

ArrayBlockingQueue<Runnable> arrayWorkQueue = new ArrayBlockingQueue(50000);
ExecutorService threadPool = new ThreadPoolExecutor(
10, //corePoolSize線程池中核心線程數
50, //maximumPoolSize 線程池中最大線程數
60, //線程池中線程的最大空閑時間,超過這個時間空閑線程將被回收
TimeUnit.SECONDS,//時間單位
arrayWorkQueue,
new ThreadPoolExecutor.DiscardOldestPolicy()//如果執行程序尚未關閉,則位於工作隊列頭部的任務將被刪除,然后重試執行程序(如果再次失敗,則重復此過程)
);

/**
*這里也可以寫一些操作,比如說對數據的加減乘除
*
*/

 

 //每1000條開啟一條線程
if (list.size() >= 1000) {
List<TBalances> list1 = new ArrayList();
list1.addAll(list);
threadPool.execute(new BatchThread(list1));
list = new ArrayList<TBalances>();
}

}

if (list.size() > 0) {
threadPool.execute(new BatchThread(list));
}

util 類:
開啟的線程類(實際線程操作):
import cn.hc.erp.base.model.TBalances;
import cn.hc.erp.base.service.DetailService;

import java.util.List;

public class BatchThread implements Runnable {

private DetailService detailService = SpringUtil.getBean("detailService", DetailService.class);

private List<TBalances> list;

public BatchThread(List<TBalances> list) {
this.list = list;
}

public BatchThread() {

}


@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "正在執行");
detailService.updateBatch(this.list);
detailService.batchInsert(this.list);
//為了減緩數據庫壓力,人工干預延遲5秒釋放線程資源
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}

}
獲取detailService的SpringUtil類:


import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;

@Service("springContextUtil")
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
SpringUtil.applicationContext = arg0;

}
public static Object getBean(String name){
return applicationContext.getBean(name);
}

public static <T> T getBean(String name,Class<T> clazz){
return applicationContext.getBean(name,clazz);
}


public static <T> T getBean(Class<T> clazz){
return applicationContext.getBean(clazz);
}
}
為了不讓子線程隨着主線程結束:
Scanner scanner = new Scanner(System.in);
System.out.println("********" + scanner.nextLine());




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM