我创建了如下一个枚举单:我需要同步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