6

Java でマルチスレッド プログラムを実装しています。それぞれthreadが typeclass Node extends Threadです。

これらのクラスはすべて、他のクラスで使用される特定の値を生成します。

生成された から値を取得するのはmain簡単ですが、それ自体threadsからthreads、他の の値を取得するにはどうすればよいthreadsですか?

//Start the threads from a list of objects
for (int i = 0; i < lnode.size(); i++) { 
    lnode.get(i).start();
}

ありがとう

4

4 に答える 4

5

あなたが次のようなことをした場合:

class MyThreadRunnable implements Runnable {
    List<String> strings;

    MyThreadRunnable(List<String> strings) {
        this.strings = strings;
    }

    public void run() {
        strings.add(getName());
    }
}

// ...

List<String> sharedStrings = new ArrayList<String>();
Thread t1 = new Thread(new MyThreadRunnable(sharedStrings));
Thread t2 = new Thread(new MyThreadRunnable(sharedStrings));

t1.start();
t2.start();

次に、t1t2(同じタイプの2つの異なるスレッド)の両方が同じリストを使用し、他のスレッドからの変更を確認します。

実際、私は簡潔にするために同期を使用していないので、これが予期しない方法でリストを破損し、奇妙なエラーを引き起こす可能性もあります。java.util.concurrentプロセスの同期と、並行性を扱う場合のパッケージを調査することを強くお勧めします。

于 2012-12-12T00:35:58.010 に答える
3

同じprocess/jvcインスタンスのスレッドである場合、「共有メモリ」は必要ありません。たとえば、コンストラクターや静的参照を介して、トレッド内のデータの参照のみが必要です。ただし、複数のスレッドがそのデータに書き込む場合は、同期/制御アクセスメカニズムが必要になります。

于 2012-12-12T00:12:14.720 に答える
1

ConcurrentHashMapを探しているように聞こえますが、もう少し詳細がないとわかりにくいです。

これらのスレッド間でどのような種類のデータを共有したいと考えていますか? また、それらをどのように共有する必要がありますか?

ところで - 一般的にはRunnable、拡張するよりも実装する方がよいと考えられていThreadます。

于 2012-12-12T00:09:42.793 に答える
-1

ThreadLocalを使用して変数を共有できます。ThreadLocalの定義を以下に示します。

スレッドローカルは、リクエストスコープやセッションスコープのように、アクセスのスコープと見なすことができます。スレッドスコープです。スレッドローカルで任意のオブジェクトを設定できます。このオブジェクトはグローバルであり、このオブジェクトにアクセスしている特定のスレッドに対してローカルになります。

詳細については、こちらをご覧ください。

于 2012-12-12T09:22:31.127 に答える