0

これが私の状況です。私はいくつかのシングルスレッドコードに取り組んでいます。コードは確率論的であり、平均を把握するには、コードの多くのインスタンスを実行する必要があります。生活をより簡単かつ迅速にするために、私の現在の解決策は を使用することExecutors.newFixedThreadPoolです。ここでの問題は、各スレッドが独自の独立したデータを持つ必要があることです。私が最初にこれを実装した方法は次のとおりです。

public class Data {
    private static Map<Thread, Data> instanceMap = new ConcurrentHashMap<Thread, Data>();

    public static Data getInstance() {
        if (!instanceMap.containsKey(Thread.currentThread()))
            instanceMap.put(Thread.currentThread(), new Data());
        return instanceMap.get(Thread.currentThread());
    }

    private Data() {
    }
}

これは、反復回数 <= スレッド数の場合に問題ありません。しかし、8 つのスレッドを使用して 20 回の反復を実行すると、問題が発生します。これらの 8 つのスレッドは 20 回の反復を実行するために再利用されるため、instanceMap8 つのインスタンスしか含まれません。

では、このようなものを処理する正しい方法は何ですか? 私が本当に必要としているのは、反復ごとにスレッドを強制終了するスレッド プールです。に与えられたオブジェクトのrunメソッドでスレッドを強制終了する方法はありますか? 検討すべき代替手段はありますか?RunnableExecutorService.submitnewFixedThreadPool

4

2 に答える 2

1

JB Nizetの答えは良いですが、あなたが持っているものを考えると、別のアプローチは、既存のRunnableものを別のものにラップするRunnableか、元の実行後にオブジェクトCallableを削除することです:DataRunnable

class DataRunnable implements Runnable {
    private final Runnable child;

    DataRunnable(Runnable aChild) { child = aChild; }

    @Override
    public void run() {
        child.run();
        Data.removeOldDataForThisThread();
    }
}

オブジェクトを使用してインスタンスを保持することで、Data.getInstance()メソッドを多少簡略化できることを付け加えておきます。ThreadLocal

public class Data {
    private static ThreadLocal<Data> datas = new ThreadLocal<Data>() {
        @Override
        protected Data initialValue() { return new Data(); }
    };

    public static Data getInstance() {
        return datas.get();
    }

    public static void removeOldDataForThisThread() { datas.remove(); }

    private Data() {
    }
}
于 2013-08-14T20:50:01.593 に答える