// 訂單隊列
Vector<P> pos;
// 派送單隊列
Vector<D> dos;
// 執(zhí)行回調(diào)的線程池
Executor executor =
? Executors.newFixedThreadPool(1);
final CyclicBarrier barrier =
? new CyclicBarrier(2, ()->{
? ? executor.execute(()->check());
? });
?
void check(){
? P p = pos.remove(0);
? D d = dos.remove(0);
? // 執(zhí)行對賬操作
? diff = check(p, d);
? // 差異寫入差異庫
? save(diff);
}
?
void checkAll(){
? // 循環(huán)查詢訂單庫
? Thread T1 = new Thread(()->{
? ? while(存在未對賬訂單){
? ? ? // 查詢訂單庫
? ? ? pos.add(getPOrders());
? ? ? // 等待
? ? ? barrier.await();
? ? }
? }
? T1.start();?
? // 循環(huán)查詢運(yùn)單庫
? Thread T2 = new Thread(()->{
? ? while(存在未對賬訂單){
? ? ? // 查詢運(yùn)單庫
? ? ? dos.add(getDOrders());
? ? ? // 等待
? ? ? barrier.await();
? ? }
? }
? T2.start();
}
其中CyclicBarrier 的回調(diào)函數(shù)我們使用了一個固定大小的線程池,你覺得是否有必要呢谐算?
回答:
回調(diào)中的線程池用單線程是為了確保從兩個隊列取數(shù)時可以一對一獲取,避免錯亂聂宾。比如說宏蛉,如果有兩個線程须床,則可能出現(xiàn)線程1獲取PO1,線程獲取PO2和DO1奖磁,線程獲取DO2的亂序。
其實線程池改成多線程也可以繁疤,要把兩個remove(0)放到一個同步塊中咖为。