2016-05-07 11 views
0

だが、私は機能は、私は、スレッド

Data[] foo(double[] someNumbers, Data[] someData, AnalyzeTool tool, int numOfThreads) 

、配列の同じ長さlenを有する与えられていましょう理解していません。

ここで、メソッドを使用してメソッドを呼び出すと、各Data.Objectを処理し、もう一方をData []に書き戻して、Data []指定とData [] writtenを保持します順番に。

スレッドが1つのデータオブジェクトの処理を終了したとします。このスレッドにはまだデータが残っているとは言えませんが、まだ処理されておらず、次のデータオブジェクトを割り当ててロックします。 「ロック」は、データオブジェクトが複数のスレッドによって何度も処理されるのを防ぐ必要があります。

誰かがそれを行う方法の例がありますか?あらゆる建設的な助けを歓迎します。

+0

は、このスレッドには良いチュートリアルです。これはPOSIXスレッドに関するものなので、構文は 'java'には当てはまりませんが、あなたの言語にかかわらず概念は同じです:https://computing.llnl.gov/tutorials/pthreads/ – yano

+1

[ExecutorService'](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html)、[Executors'](https://docs.oracle)を参照してください。 .com/javase/7/docs/api/java/util/concurrent/Executors.html)と['Future'](https://docs.oracle.com/javase/7/docs/api/java/util/ concurrent/Future.html)をjava.util.concurrentパッケージに追加します。 –

+0

各スレッドは、リストの長さだけでなくデータリスト内の位置も知っている必要があります。それで、データが残っていることを彼らが知る方法です。また、スレッドのこのコンテキストで用語「ロック」を完全に理解しているかどうかはわかりません –

答えて

0

:私はこのようなものを想像しています[]アイテム。すべてのデータ項目が作業であるとしましょう。

ExecutorServiceは、すべての作業を完了するためのワーカーグループ(スレッドプール)があるファクトリを提供します.Executorサービスは各ワーカー(スレッド)に作業を1つずつ割り当てます彼らの誰かが終わり、より多くの仕事がそこにあり、彼らはそれに割り当てられます。

は、この例を考えてみます。

ExecutorService executor = Executors.newFixedThreadPools(5); 
//lets say we have 5 workers with us. 

//then submitting all your work (a runnable) to the factory 
for(int i=0;i<n;i++){ 
    executor.submit(new work(someData[i])); 
} 

キュータは、ようにあなたが提出した後、プールから次を拾うような作業をやって起動....となります。

は単に、その後、

executor.shutdown(); 
1

JDK 8とストリームを使用しています。私はそれぞれのデータで行われるタスクの多くを持って考えると

:マルチスレッドへの新規なので、私の経験で私はこのような何かをやっているだろう

List<Data> foo(List<Double> someNumbers, List<Data> someData, AnalyzeTool tool) { 
    return someData.parallelStream().map((t, n) -> t.doSomething(n)).collect(Collectors.toList()); 
} 
関連する問題