java 多线程池_Java ThreadPoolExecutor线程池 同时执行50个线程
最近項目上有個需求,需要從FTP服務(wù)器中下載大批量的數(shù)據(jù)文件,然后解析該數(shù)據(jù)文件進(jìn)行入庫,數(shù)據(jù)庫為oracle,最后在通過web工程,以報表和圖表的形式進(jìn)行展現(xiàn)。
這些批量的數(shù)據(jù)文件為純文本文件,每天產(chǎn)生數(shù)據(jù)文件大概有1500個,每個文件大概有500KB,且隨著時間的推移這些數(shù)據(jù)文件會逐漸增多。
之前的實現(xiàn)方式是,通過每天按時觸發(fā),建立一個FTP連接,使用這個連接讀取文件,讀取一個下載一個。部署到生成環(huán)境后,測試發(fā)現(xiàn)全部完成后,需要7個小時,如果文件隨時間的增長,顯然是不能接受的。
因此,這里需要改成多線程來處理,這樣就可以縮短讀取的時間,這里做了個案例,用來套用到修改的程序中,案例代碼如下:
實現(xiàn)代碼:package?com.what21.thpool;
import?java.util.concurrent.ArrayBlockingQueue;
import?java.util.concurrent.BlockingQueue;
import?java.util.concurrent.ThreadPoolExecutor;
import?java.util.concurrent.TimeUnit;
import?java.util.concurrent.ThreadPoolExecutor.AbortPolicy;
public?class?ThreadPoolMain?{
/**
*?@param?args
*/
public?static?void?main(String[]?args)?{
//線程池維護線程的最少數(shù)量
int?corePoolSize?=?50;
//線程池維護線程的最大數(shù)量
int?maximumPoolSize?=?Integer.MAX_VALUE;
//線程池維護線程所允許的空閑時間
long?keepAliveTime?=?4;
//線程池維護線程所允許的空閑時間的單位
TimeUnit?unit?=?TimeUnit.SECONDS;
BlockingQueue?taskQueue?=?new?ArrayBlockingQueue(10);
//?AbortPolicy?策略
//?處理程序遭到拒絕將拋出運行時RejectedExecutionException
AbortPolicy?handler?=?new?ThreadPoolExecutor.AbortPolicy();
//?初始化線程池
ThreadPoolExecutor?threadPool?=?new?ThreadPoolExecutor(corePoolSize,?maximumPoolSize,
keepAliveTime,?unit,?taskQueue,?handler);
//?線程池執(zhí)行
for(int?i=0;i<1000;i++){
final?int?count?=?i;
threadPool.execute(new?Thread(new?Runnable(){
@Override
public?void?run()?{
try?{
Thread.sleep(1*1000);
}?catch?(InterruptedException?e)?{
e.printStackTrace();
}
System.out.println(count);
}
}));
}
}
}
執(zhí)行流程描述:
1、線程池threadPool初始化時,任務(wù)隊列taskQueue中的線程為空,線程池是不會馬上執(zhí)行的。
2、當(dāng)調(diào)用 線程池threadPool的execute()方法時,添加一個線程,線程池會做出如下的判斷:
a、如果當(dāng)前正在運行的線程數(shù)量小于corePoolSize,就立即創(chuàng)建并執(zhí)行這個線程;
b、如果當(dāng)前正在運行的線程數(shù)量大于或等于corePoolSize,新添加的線程會放入隊列;
c、如果隊列滿了,正在運行的線程數(shù)量小于 maximumPoolSize,就繼續(xù)創(chuàng)建線程運行這個任務(wù);
d、如果隊列滿了,正在運行的線程數(shù)量大于或等于 maximumPoolSize,線程池threadPool會拋出不能接受新任務(wù)的異常。
3、當(dāng)一個線程完成任務(wù)時,它會從隊列taskQueue中取出一個任務(wù)來進(jìn)行執(zhí)行。
4、當(dāng)一個線程執(zhí)行完畢時,超過一定的時間keepAliveTime時,線程池threadPool會判斷,如果當(dāng)前池中運行的線程數(shù)大于corePoolSize,那么這個線程就被停掉。線程池threadPool的所有任務(wù)完成后,它最終會收縮到corePoolSize的大小。
通過使用上述原理的多線程功能實現(xiàn),且每次都有50個線程并發(fā)執(zhí)行,測試后,發(fā)現(xiàn)大大的降低了執(zhí)行時間,變成了2個多小時,實踐證明多線程就是好!!!
總結(jié)
以上是生活随笔為你收集整理的java 多线程池_Java ThreadPoolExecutor线程池 同时执行50个线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学计算机U盘内存,在U盘上设置虚拟内存
- 下一篇: exec go 重启_无停机优雅重启 G