0

私は配列に保持する5のスレッドプールを持っています:

private static final Collection<Thread> workerThreads = new ArrayList<Thread>();

しかし、osgi プラグインを再アップロードすると、スレッドは実行され続けますが、配列は空になるため、新しい 5 つのスレッドが読み込まれます。そのため、最終的には大量のスレッドが実行されます。

私のスレッド プールは永久に実行されるように設計されています。アイドル状態のままで、ジョブがキューに入るのを待ちます。

while (!queue.isEmpty()) {
        try {
            Job takenJob = queue.poll(5000, TimeUnit.MILLISECONDS);
            if (takenJob != null) {
                takenJob.execute();
            }
        } catch (InterruptedException e) {
            log.error("ERROR", e);
        }
    }

基本的に問題は、osgi プロジェクトを再アップロードした後、古いスレッドへの参照が失われることです。

考えられる解決策: スレッドの有効期間を定義する必要があるため、プールはありませんが、各スレッドは最大 15 分存続してから終了します。その間、新しいスレッドが 15 分ごとに作成されるため、常にキューを監視しているスレッドがいくつかあります。

標準のjava.util.Date getTime()を使用するだけでは最善の方法ではないようです。これを実装する方法について何か提案はありますか?

4

2 に答える 2

2

最善の解決策は、ExecutorService を使用し、バンドルが終了したら閉じることです。https://github.com/bndtools/bndtools-rtプロジェクトには、そのようなエグゼキューターをサービスとして登録するバンドルが含まれており、ライフサイクルの問題がすべて適切に対処されるようにします。

于 2013-06-12T12:41:41.053 に答える
2

バンドルが停止しているときに、スレッドを終了し、すべてのリソースを解放する必要があります。たとえば、BundleActivator 停止メソッドで実行できます。

新しいスレッドがある場合は、停止関数が戻る前にスレッドがジョブを終了することも確認する必要があります。これは、ジョブが終了するまでに長時間実行する必要がある場合 (反復などにより)、中断できるように設計する必要があることを意味します。

于 2013-06-12T09:01:54.880 に答える