2013-06-18 93 views
1

我創建瞭如下一個枚舉單:我需要同步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);  
} 
+0

嗯......它可能是片段是從你的代碼的不同版本?如果logData()或logSData()不是線程安全的,你會遇到併發問題。但是,然後使用線程池根本沒有任何意義。 – Axel

+1

你的'執行者'應該是'final';此刻,沒有任何東西可以阻止外部方法將其設置爲「null」! – fge

+0

@fge感謝您指出最後的事情。 – Rips

回答

2

現在我的查詢是否會面臨任何併發問題,如果我提交 很多請求到多線程隊列?

沒有沒有必要使用同步。

public synchronized void submitTask(Runnable task) {  
    executor.execute(task);  
} 

即使在這裏,它是安全的刪除同步。

public enum Logger { 
    INSTANCE; 

    ExecutorService pool = Executors.newFixedThreadPool(4); 

    public void log(String logType, String logData){ 
     //you internally create a instance of your runnable and not leave on caller to create instance 

     pool.execute(new MyRunnable(logType, logData)); 
    } 
} 
+0

這個問題表明它是一個固定大小的線程池。 – flup

+0

我的壞會改變它:) –