0

私のプログラムはスレッドを使用しますが、リンク/ページのコレクション、クエリに関する情報 (更新中かどうか)、その他の情報 (boolean フィールド、int フィールドなど) などのいくつかの変数をスレッドで共有する必要があります。

この場合、すべてのスレッドが同じ作業を処理しますが、コレクションの要素は異なります。

これらの共有データを保持するためだけにクラス/オブジェクトを作成しない方法があるかどうか知りたいです。

私の状況:データベースに処理が必要なページがたくさんあり、一度にすべてを回復することはできません。各スレッドには、ページのリストがデータベースからのリンクで更新されているかどうかを通知するブール フィールドがあります。各スレッドには、処理するページのコレクションがあります。

過去のプログラムで、私は同様の状況にありました。それを解決するために、これらの状態を保持するマスターと、マスターから情報を取得するスレーブを作成します。しかし、今はマスターを使わずにスレーブだけで作業したいのですが、すべてのスレッドに対して変数を 1 つだけ持つ方法があるかどうかを知る必要があります。

例:スレッド 1 がブール値を true に自動的に更新すると、他のすべてのスレッドはこのブール値を true にします。

4

2 に答える 2

4

スレッド間でデータを共有する必要がある場合は、データが同期された方法で共有されていること、つまり、データ構造がスレッドセーフであることを確認する必要があります。

java.util.concurrentパッケージをご覧ください。たとえば、実装の1つ(BlockingQueue、、、、、、)を利用できます。ArrayBlockingQueueDelayQueueLinkedBlockingDequeLinkedBlockingQueuePriorityBlockingQueueSynchronousQueue


java.util.concurrent.atomicコメントについて:パッケージもご覧ください。そこには、、などAtomicBooleanのクラスがあります。AtomicIntegerAtomicReference


例:thread1がブール値をtrueに自動的に更新すると、他のすべてのスレッドはこのブール値をtrueとして設定します。

そのような場合はを使用することをお勧めしますAtomicBoolean。おそらく、宣言している限り、通常のものを使用することもできます(比較と設定の操作などが必要ない場合)。booleanvolatile

于 2011-07-18T19:33:58.623 に答える
0

このようなことができます。このパターンを使用すると、一度に多くのタスクを作成することなく、多数の同時タスクをスケジュールできます。

ThreadPoolExecutor tpe = new ThreadPoolExecutor(10, 10, 10, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());
while(isMoreWork()) {
    while(tpe.getQueue().size() > 10) {
        Thread.sleep(1);
    }
    final String link = 
    tpe.submit(new Runnable() {
        @Override
        public void run() {
            processLink(link);
        }
    });
}
于 2011-07-18T20:17:20.923 に答える