我創建瞭如下一個枚舉單:我需要同步ExecutorService.execute()嗎?
public enum Logging {
INSTANCE;
ExecutorService pool = Executors.newFixedThreadPool(4);
}
我現在用的這個池特定情況下的異步日誌記錄。 長途區號象下面這樣:
Logging.INSTANCE.execute(new MyRunnable("LogType.A",logData));
的MyRunnable對象的運行方法簡單象下面這樣:
public class MyRunnable {
public MyRunnable(LogType logType,String logData){
this.logType=logType;
this.logData=logData;
}
public void run() {
switch(logType) {
case A:
logData(Logger.getLogger(A_LOG),logData);
break;
case B:
logData(Logger.getLogger(B_LOG,logData));
break;
}
private void logData (Logger logger,String logdata) {
if(some condition)
logger.info(logdata);
else
do something else;
}
}
現在我的查詢是我將面對任何併發的問題,如果我提交大量請求,以多線程隊列嗎?不是executor.execute(任務)是否已經同步?或者是否需要在同步方法(在Logging enum中)中包含execute方法,並且調用如下方法:
public synchronized void submitTask(Runnable task) {
executor.execute(task);
}
嗯......它可能是片段是從你的代碼的不同版本?如果logData()或logSData()不是線程安全的,你會遇到併發問題。但是,然後使用線程池根本沒有任何意義。 – Axel
你的'執行者'應該是'final';此刻,沒有任何東西可以阻止外部方法將其設置爲「null」! – fge
@fge感謝您指出最後的事情。 – Rips