0

Synchronized static singleton ThreadPool Executor を定義済みのプロパティで初期化したいと考えています。

アプリケーション全体で利用できるようにしたいので、サーバーの再起動または停止時に破棄する必要があります。

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

:にServletContextListenerを実装するクラスを使用します。web.xml

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

クラスThreadPoolManagerはメソッドcontextInitilized(ServletContextEvent)とをオーバーライドする必要がありますcontextDestroyed(ServletContextEvent)。メソッドcontextInitilized(ServletContextEvent)が呼び出され、Webアプリケーションの初期化プロセスが開始されます。したがって、そこで初期化作業を行う必要があります。同様にcontextDestroyed(ServletContextEvent)、サーブレットコンテキストがシャットダウンされようとしているときに、メソッドが呼び出されます。したがって、そこでクリーンアップ作業を行う必要があります。

于 2012-12-05T15:03:17.280 に答える