業務需求是這樣:接受大量效能資料,要求多執行緒處理效能資料,且在任一時刻同種效能資料只能有一條在處理。
這裡有5個類:
processscheduler:入口,用於接受效能資料,並將每條效能資料加到佇列中處理
actionexecutor:執行緒池包裝類
actionqueue:任務佇列類,用於儲存同種效能任務,保證執行緒安全及,佇列中只有一條任務在乙個時刻 處理
processaction:任務類,每條效能任務包裝成乙個任務,且對資料處理的業務邏輯在此類中
actioncommand:command類,實現runnable介面,包裝任務類,用於執行緒池處理
以下**以最簡潔方式呈現
public final class actionqueue
public void addprocessaction(processaction action)
}// 若這時沒有這種任務在處理,則從actionqueue中獲得乙個可執行action,否則返回null
public processaction borrowonecanexecuteaction()
return null;}}
}
public final class processaction
public void execute()
}
public final class actioncommand implements runnable
public void run()
}
public final class processscheduler
private processscheduler()
public void process(listdatas)
}private void addaction(string location, processaction action)
if (!bstart)
//獲取該任務所屬佇列,將任務加入佇列,並處理佇列中一條任務
actionqueue queuefind = actionqueuemap.putifabsent(location,new actionqueue());
if(queuefind == null)
queuefind.addprocessaction(action);
processqueue(queuefind);
}// 從任務佇列倉庫中根據location獲取佇列,並嘗試處理佇列中一條可處理任務
public void exeactionbylocation(string location)
",location);
actionqueue queuefind = actionqueuemap.get(location);
if (queuefind == null)
processqueue(queuefind);
}// 嘗試從任務佇列queue取一條任務 並將其放入執行緒池處理
private void processqueue(actionqueue queue)
}//設定狀態bstart為true保證start方法只執行一次 呼叫actionexecutor的start方法
private synchronized void start()
bstart = true;
this.actionexecutor.start();
}}
public final class actionexecutor
//處理任務類,將其包裝為乙個command類,並放入執行緒池中
public void executeaction(processaction action, actionqueue queue)
}//例項化執行緒池物件
@suppresswarnings()
public void start()
blockingqueue blockingqueue = new linkedblockingqueue();
rejectedexecutionhandler handler = new threadpoolexecutor.discardpolicy()
", r);}};
this.executor = new threadpoolexecutor(corepoolsize, maxcurrentnum,
thread_keeplive_minute, timeunit.minutes,
blockingqueue, handler);
this.executor.setthreadfactory(new schedulerthreadfactory());
this.isstart = true;}}
// 靜態內部類用於包裝新建執行緒,主要功能是設定執行緒名稱、優先順序以及將新建執行緒設為非守護執行緒
static class schedulerthreadfactory implements threadfactory
@override
public thread newthread(runnable r)
return t;}}
}
這就是對這個業務需求的處理,我已經刪減過了 多執行緒處理任務
進行任務分解 long begin system.currenttimemillis list futurelist this.getsmoothdatafuture fundidlist,30 阻塞等待所有執行緒全部執行完畢 for futurefuture futurelist log.info...
多執行緒學習 任務,程序,執行緒
多個任務都在做,其實本質上我們的大腦在同一時間依舊只做了一件事情。程式是指令和資料的有序集合,其本身沒有任何執行的含義,是乙個靜態的概念。通常在乙個程序中可以包含若干個執行緒,當然乙個程序至少有乙個執行緒,不然沒有存在的意義。執行緒是cpu排程和執行的單位。執行緒就是獨立的執行路徑 在程式執行時,即...
多執行緒任務排程學習
昨天找到一套多執行緒任務排程的 相當的不錯,先把思路總結一下。首先需要有乙個任務管理器來管理所有的任務,任務管理器提供新增新任務的介面。然後需要有乙個執行緒池管理器管理所有的執行緒,執行緒分三種狀態 建立 執行 空閒三種狀態,執行緒可以執行任務task。主流程通過乙個taskmonitorthrea...