0

我想用我定义的属性初始化同步静态单例线程池执行器。

我希望它在整个应用程序中都可用,并且应该在服务器重新启动或停止时被销毁。

public class ThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor {
    private static Properties properties;
    static {
        try {
            properties.load(ThreadPoolExecutor .class.getClassLoader().getResourceAsStream("config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static final int defaultCorePoolSize = Integer.valueOf((String) properties.get("CORE_POOL_SIZE"));
    static final int defaultMaximumPoolSize = Integer.valueOf((String) properties.get("MAX_POOL_SIZE"));
    static final long defaultKeepAliveTime = Integer.valueOf((String) properties.get("KEEP_ALIVE_TIME"));
    static final TimeUnit defaultTimeUnit = TimeUnit.MINUTES;
    static final BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
    private static ThreadPoolExecutor instance;

    private ThreadPoolExecutor() {
        super(defaultCorePoolSize, defaultMaximumPoolSize, defaultKeepAliveTime, defaultTimeUnit, workQueue);
    }

    synchronized static ThreadPoolExecutor getInstance() {
        if (instance == null) {
            instance = new ThreadPoolExecutor();
        }
        return instance;
    }   

这就是我到目前为止所做的(我是多线程的新手)。

由于我的应用程序完全基于多线程,我如何在这里实现我的要求和任何需要改进的地方!正如我所说,我如何在整个应用程序中维护/使其可用。

4

1 回答 1

2

使用在您的ServletContextListenerweb.xml中实现的类:

<web-app>
    <!-- ... -->
    <listener>
        <listener-class>com.domain.ThreadPoolManager</listener-class>
    </listener>
</web-app>

该类ThreadPoolManager应覆盖方法contextInitilized(ServletContextEvent)contextDestroyed(ServletContextEvent). 该方法contextInitilized(ServletContextEvent)在 Web 应用程序初始化过程开始时被调用。所以,你应该在那里做你的初始化工作。类似地,contextDestroyed(ServletContextEvent)当 servlet 上下文即将关闭时,将调用该方法。所以,你应该在那里做你的清理工作。

于 2012-12-05T15:03:17.280 回答