2016-06-13 22 views
2

リアルタイムの在庫データを提供するサードパーティのAPIは、各スクリップの価格更新ごとに新しいスレッドを作成しています(下記のコードのセクション)。Java - スレッドが多すぎるマルチスレッドの問題

byte[] data = new byte[byteLength]; 
System.arraycopy(byteArray.toByteArray(), index, data, 0, data.length); 
new Thread(new BrokerAPI.parseData(data)).start(); 

これは(4 - 5時間)程度250,000+スレッド毎日を作成しても私のような初心者に悪いデザインのように見えました。価格は更新されていますが、私のプログラムは約2時間後にNullPointerExceptionをスローし始めます。私は問題が発生しているスレッドの数が多いために発生していると思われる。

私が監視する必要のscripsの合計数は約120であるので、私は特定のスレッドに書き込まれ、各価格更新120スレッドの最大を持っていることの方法で探しています。

私はこのニーズに応えるべきだと思いLinkに提供される解決策(プロデューサー/コンシューマーパターン)を参照してください。これを新しいコードに変換する方法についてのガイダンスをリクエストしてください。あるいは、最小数のスレッドでこれを達成する他の方法があれば、うれしいでしょう。

+2

だけでなく、あなたがソースを編集することができた場合新しいスレッド構造を委譲で置き換えて、目的のサイズのスレッドプールを作成します。このAPIはCPUにバインドされているため、コアより多くのスレッドを作成すべきではありません。 – John

+1

このサードパーティAPIを編集する権限と能力がありますか?そうでない場合は、何もできません。可能であれば、私は 'Executors'と' ExecutorService'についてお読みください。 – ControlAltDel

答えて

4

NullPointerExceptionsが、あまりにも多くのスレッド、他の何か休憩し、それらに(関連する可能性の高いメモリ)を引き起こすの直接の結果ではありません。

あなたはどこか

private static final ExecutorService executorService = Executors.newCachedThreadPool(); 

マネージスレッドプールを作成し、それを(再)独自のスレッドを作成するのではなく、使用にどのようなスレッドを決めてみましょう:

byte[] data = new byte[byteLength]; 
System.arraycopy(byteArray.toByteArray(), index, data, 0, data.length); 
executorService.execute(new BrokerAPI.parseData(data)) 
+0

ありがとうございます。私は、ライブデータストリーミングセッション中にあなたがアドバイスしたとおりに変更を行い、明日テストします。 – iCoder

+0

これは、作成されるスレッドの数を減らすのに間違いなく役立ちました。しかし、私はまだNullPointerExceptionをTableViewをソートするときは、別の質問としてそれを求めます。ありがとう – iCoder

関連する問題