首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ThreadPoolExecutor同步

ThreadPoolExecutor同步
EN

Stack Overflow用户
提问于 2011-11-23 01:12:43
回答 2查看 3.1K关注 0票数 2

我以前从未使用过并发库。

代码语言:javascript
复制
public class QueueExecutor  {
 static final int defaultCorePoolSize = 5;
 static final int defaultMaximumPoolSize = 10;
 static final long defaultKeepAliveTime = 10;
 static final TimeUnit defaultTimeUnit = TimeUnit.MINUTES;
 static final BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
 private static ThreadPoolExecutor instance;

 private QueueExecutor() {
  instance = new ThreadPoolExecutor(defaultCorePoolSize, defaultMaximumPoolSize, defaultKeepAliveTime, defaultTimeUnit, workQueue);
 }  

public static ThreadPoolExecutor getInstance() {
     if (instance == null) {
         QueueExecutor();
     }
     return instance;
 }

public static add(Runnable runnable){

} instance.execute(runnable);

}

我的问题是,如果这个对象在JBoss应用程序容器中运行,我应该同步addgetInstance函数吗?为什么?我认为这些ThreadPoolExecutor已经同步了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-23 01:25:44

我可以说两件事。

  1. 声明instance final (并相应地初始化它)。因为它是静态的,所以只有在类初始化时才会创建它,并且调用该类的唯一时间是getInstance()。如果这样做,则无需担心synchronization.
  2. The,因为add不需要同步,因为execute方法为您处理所有同步。

说到这两点,建议避免在J2EE环境中创建自己的线程。你可以阅读更多here

票数 4
EN

Stack Overflow用户

发布于 2011-11-23 01:32:12

ThreadPoolExecutor已经是thread-safe,但您的类不是。同步getInstance(),或者至少同步正在检查和初始化实例的块。add()不需要同步,因为它只是委托操作,但我更喜欢使用getInstance().execute(runnable),这样您就不会得到NullPointerException

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8230816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档