2013-06-18 91 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

我的坏会改变它:) –