2016-05-03 5 views
0

スレッドの数を考慮して配列を分割する必要があります。例えば、私は配列を持っています[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]と要素この配列内にあります。私の仕事は、配列の要素とスレッドの間で作業を配布することです。Javaマルチスレッドアレイを分離する

スレッド数= 2 - >スレッド1:[1] [2] [3] [4] [5]スレッド2:[6] [7] [8] [9] [10]。 スレッドがインスタンス7の場合はどうすればいいですか?この場合、仕事を分けるためにホ?ここ

+1

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] '* 10次元配列* 10要素の配列。 '{1,2,3,4,5,6,7,8,9,10}'は10要素の配列です。 – Andreas

+0

ExecutorServiceを必要な数のスレッドを持つスレッドプールで使用する方法はありますか? ExecutorService pool = Executors.newFixedThreadPool(poolSize)と同様です。次に、配列を反復し、各要素をパラメータとして実行可能なタスクに送信することによって、タスクを送信できます。 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html – mdewit

答えて

2

は、スレッドへの入力配列を分割したサンプルアプリケーションです。実際に

final int threadCount = 7; 
final int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

int from = 0; 
for (int i = 0; i < threadCount; i++) { 
    final int to = (from + (int) Math.ceil((a.length - from)/(double) (threadCount - i))); 
    System.out.println("Thread #" + i + " will use " + Arrays.toString(Arrays.copyOfRange(a, from, to))); 

    from = to; 
} 

(@Andreasのおかげで)、代わりに天井の、あなたは、単に整数演算を使用することができます。

final int to = from + ((a.length - from)/(threadCount - i)); 

出力:

Thread #0 will use [1, 2] 
Thread #1 will use [3, 4] 
Thread #2 will use [5, 6] 
Thread #3 will use [7] 
Thread #4 will use [8] 
Thread #5 will use [9] 
Thread #6 will use [10] 
+0

私は 'Math.round()'がより好きです。 ;-) – Andreas

+0

@Andreas math.roundは動作しません。たとえば、11個の要素と10個のスレッド –

+0

が動作します。それを試してみてください。あなたは 'Math.floor()'を行うことさえできます。なぜ、最初のスレッドがすべて楽しくなるはずですか? – Andreas