執行緒池使用

2021-08-11 16:50:49 字數 2729 閱讀 9812

1.定義乙個執行緒池,用來執行實現callable介面的任務類.當阻塞佇列新添乙個任務類時,將while迴圈新增設定乙個變數startexcute,當阻塞佇列新添第乙個任務時,將startexcute設定為true,並呼叫excutetaskcall方法,使用執行緒池執行阻塞佇列的任務。當阻塞隊列為空時,呼叫taskcallqueue.take()方法,執行緒阻塞,直到阻塞佇列有任務時才往下執行。linkedblockingqueue是執行緒安全的阻塞佇列,遵循先進先出的原則。

/**

* 執行緒池執行任務類

* @author adai

* @since 2017 12 02 21:42

* */

public class asyexcutequeryrwstatus catch (interruptedexception | executionexception e) finally else }}

} }/**

* 執行緒池執行任務

*/public static void excutetask() catch (interruptedexception e) }

/*** 關閉執行緒池

*/public void shutdown() }

/*** 新增任務到阻塞佇列中

* @param taskthrad 要執行的執行緒任務。

*/public static void addtaskthread(runnable taskthrad)

/*** 新增任務到阻塞佇列中

* @param taskcall 要執行的執行緒任務。

*/public static void addtaskcall(callable> taskcall)

}

2.定乙個實現callable介面的任務類,並實現call()方法,執行相應的任務邏輯。

/**

* 執行緒任務類

* @author adai

* @since 20171202 21:48

*/ /** 查詢充值提現狀態需要的條件 */

private maptask = null;

/** 呼叫pe框架的封裝的dubbo服務 */

private routerdubboservice routerdubboservice;

/** 修改充值提現狀態入庫的工具類 */

private writetransactionjnl writetransactionjnl ;

public queryrwstatustask2(maptask , routerdubboservice routerdubboservice ,

writetransactionjnl writetransactionjnl )

@override

public mapcall() throws exception

/*** 呼叫dubbo服務,傳送工行介面查詢充值提現的狀態。

* @return 返回查詢回來的結果

*/public mapexcutetask()

result.put("openbankid", openbankid) ;

result.put("trsjnlno", trsjnlno) ;

}catch (peruntimeexception e) finally

} @override

}}

3.模擬乙個類,將要執行的任務新增到阻塞佇列中。

/**

* 將任務新增到阻塞佇列類

* @author adai

* @since 20171202 21:57

*/public class asyqueryaccoutprocessserviceimpl extends abstractasyservice implements asyservice }

public void setrouterdubboservice(routerdubboservice routerdubboservice)

public void setwritetransactionjnl(writetransactionjnl writetransactionjnl)

}

4.此**業務場景:

浦發介面當他行卡充值提現時,並不能即使的將充值提現的結果查詢回來,所以充值提現的狀態需要通過查詢介面查詢回來。目前知道的處理方法是在晚間啟動定時任務去發介面去查詢回來,再將返回的資料狀態狀態入庫。現在遇到的問題是,使用公司自己的框架,本人不知道怎麼將公司封裝的dubbo服務引用到跑批的專案中。於是想到這種辦法。但這樣辦法還是存在許多顧慮的問題和不足。

問1:當阻塞佇列中只有一條資料時,並且查詢的狀態一直為銀行處理中,while迴圈一直執行,並且頻繁的傳送銀行的介面,銀行返回的狀態一直是銀行處理中,而銀行充值提現預計到賬的時間為兩個小時。執行緒池又頻繁的傳送介面查詢,浪費資源。是否可以控制時間,過一定的時間在查詢?

問2:當某個任務查詢介面返回的狀態一直處於銀行處理中,如何將該任務從佇列中移除出去。(浦發的介面,狀態查詢的有限期為七天,如果七天內並未查詢到對應的狀態,而阻塞佇列一直存在這個任務,則浪費資源。)

問3:如果工程部署到兩台伺服器上,是否有影響?

問4:在多執行緒併發時,是否有影響?

問5:如何進行擴充套件,如果dubbo服務和入庫工具類,是不同的類,怎麼將對應的dubbo服務呼叫相應的介面,進行對應的入庫操作。

執行緒池使用

一 執行緒池的構造器 public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit,blockingqueueworkqueue,threadfactory thread...

使用執行緒和執行緒池

1 new thread的弊端 執行乙個非同步任務你還只是如下new thread嗎?new thread new runnable start 那你就out太多了,new thread的弊端如下 a.每次new thread新建物件效能差。b.執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭...

執行緒池的使用

簡而言之 兩個類 執行緒池的 類 public class threadpoolproxyfactory return mnormalthreadpoolproxy return public static threadpoolproxy createdownloadthreadpoolproxy ...