2016-05-03 12 views
0

2つのスレッドを作成するはずです。一方はファイルからのデータを読み込み、Merchandiseクラスのオブジェクトを作成します。ファイル自体は10,000行以上で構成されています。別のスレッドで1つのスレッドでデータを作成する

最初のスレッドは、Merchandiseオブジェクトの行とそれについて書き込む200個のオブジェクトを作成します。私が持っている問題は、最初のスレッドと同じ時間に作業し、これらのオブジェクトを取得し、全体の重みを合計し、100を追加したレポートを追加するという、2番目のスレッドが必要だということです。

スレッドを使用して、他のスレッドで作成されたオブジェクトデータを同時に取得するにはどうすればよいですか? HashMapを使用して、新しく作成されたクラスオブジェクトを2つの変数で保存することをお勧めしますか?

+1

静的変数は、HashMapの代わりに1つのオプションです。ConcurrentHashMapを使用します。 – style

+1

したがって、このコードを書くために私に支払うことができるようにpaypalアカウントをしますか? –

+0

スレッド間通信を行う方法を読んでおく必要があるようです。 – tnw

答えて

0

生産者/消費者の問題のようです。この公式リンクは、コンセプトの理解と実装に役立ちます。

Guarded Blocks

基本的な考え方は、プロデューサーが何かを生産している場合を除き、消費者が消費することはできません。

+1

私は2つの理由から "Guarded Blocks"から離れています。 (1)wait()/ notify()の全体はJava noobsの混乱の無限のソースです。私は知っている、チュートリアルの全体的なポイントは、彼らがそれを得るのを助けることですが、...(2)あなたが騒ぎであり、あなたが保護されたブロックが必要だと思うなら、チャンスはあなたが再発明している図書館があなたに無料で提供するもの。この場合、 'BlockingQueue'と同様です。 –

1

あるスレッドから別のスレッドにデータを渡すときは、データ構造がthread-safeである必要があります。正しく指摘したように、HashMapはスレッドセーフではありません。 Javaのスレッドセーフなコレクションについては、java.util.concurrentパッケージを参照してください。プロデューサ - コンシューマパターンの実装方法は、LinkedBlockingQueueという最も簡単な方法の1つです。ここで

2つのスレッド、1つの産生のオブジェクト、すべての100のオブジェクトを消費し、何かを印刷し、他の1との完全な例です:

AtomicBoolean finished = new AtomicBoolean(false); 
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(); 

Thread thread1 = new Thread(() -> { 
    for (int i = 0; i < 10000; i++) { 
     String createdObject = Integer.toString(i); 
     queue.offer(createdObject); 
    } 
    finished.set(true); 
}); 

Thread thread2 = new Thread(() -> { 
    int count = 0; 
    while (!finished.get() || !queue.isEmpty()) { 
     try { 
      String object = queue.poll(100, TimeUnit.MILLISECONDS); 
      if (count++ % 100 == 0) { 
       System.out.println(object); 
      } 
     } catch (InterruptedException e) { 
      throw new RuntimeException(e); 
     } 
    } 
}); 

thread1.run(); thread2.run(); 
thread1.join(); thread2.join(); 

あなたは一つのことに気づくかもしれ - 離れて生産品目、また、スレッドから他の情報を交換する必要があります - プロデューサーが終了したら。ここでも、同期せずにこの情報を安全に交換することはできません。この例のようにAtomicBoolean、またはvolatile fieldを使用できます。

関連する問題