java 多线程池_Java ThreadPoolExecutor线程池 同时执行50个线程
最近項目上有個需求,需要從FTP服務器中下載大批量的數據文件,然后解析該數據文件進行入庫,數據庫為oracle,最后在通過web工程,以報表和圖表的形式進行展現。
這些批量的數據文件為純文本文件,每天產生數據文件大概有1500個,每個文件大概有500KB,且隨著時間的推移這些數據文件會逐漸增多。
之前的實現方式是,通過每天按時觸發,建立一個FTP連接,使用這個連接讀取文件,讀取一個下載一個。部署到生成環境后,測試發現全部完成后,需要7個小時,如果文件隨時間的增長,顯然是不能接受的。
因此,這里需要改成多線程來處理,這樣就可以縮短讀取的時間,這里做了個案例,用來套用到修改的程序中,案例代碼如下:
實現代碼: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)?{
//線程池維護線程的最少數量
int?corePoolSize?=?50;
//線程池維護線程的最大數量
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);
//?線程池執行
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);
}
}));
}
}
}
執行流程描述:
1、線程池threadPool初始化時,任務隊列taskQueue中的線程為空,線程池是不會馬上執行的。
2、當調用 線程池threadPool的execute()方法時,添加一個線程,線程池會做出如下的判斷:
a、如果當前正在運行的線程數量小于corePoolSize,就立即創建并執行這個線程;
b、如果當前正在運行的線程數量大于或等于corePoolSize,新添加的線程會放入隊列;
c、如果隊列滿了,正在運行的線程數量小于 maximumPoolSize,就繼續創建線程運行這個任務;
d、如果隊列滿了,正在運行的線程數量大于或等于 maximumPoolSize,線程池threadPool會拋出不能接受新任務的異常。
3、當一個線程完成任務時,它會從隊列taskQueue中取出一個任務來進行執行。
4、當一個線程執行完畢時,超過一定的時間keepAliveTime時,線程池threadPool會判斷,如果當前池中運行的線程數大于corePoolSize,那么這個線程就被停掉。線程池threadPool的所有任務完成后,它最終會收縮到corePoolSize的大小。
通過使用上述原理的多線程功能實現,且每次都有50個線程并發執行,測試后,發現大大的降低了執行時間,變成了2個多小時,實踐證明多線程就是好!!!
總結
以上是生活随笔為你收集整理的java 多线程池_Java ThreadPoolExecutor线程池 同时执行50个线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学计算机U盘内存,在U盘上设置虚拟内存
- 下一篇: java实验_Java实验报告(实验一)