2010-12-10 17 views
1

私は2D配列の最大要素を見つけようとしています。パラメータとして2darrayを受け取り、最大値を見つける方法があります。スレッドがparrallelを実行し、各スレッドを結合し、それらの最大値を見つけて2次元配列全体の最大値を得るように、各行の最大要素を別個のスレッドとして見つける必要があります。今私が持っている問題は、run()が値を返さないということです...どのように私は変更された値にアクセスする必要があります。たとえば、Javaでの並列スレッド

public static int maxof2darray(long[][] input){ 


ArrayList<Thread> threads = new ArrayList<Thread>(); 
long[]rowArray; 
for(int i=0; i<input.length; i++){ 
rowArray = input[i]; 
teste r1 = new teste(rowArray,max); 
threads.add(new Thread(r1)); 
} 

for (Thread x : threads) 
    { 
     x.start(); 

    } 
try { 


for (Thread x : threads) 
{ 
     x.join(); 
} 
} 

のように、スレッドオブジェクトのarraylistを作成します。次に、各行を取り、その行の最大値を見つけるrun()関数を呼び出します...問題は実行されます()は値を返しません...どうすればその行の最大値にアクセスできますか?

+0

おそらく、先物または他のより高いレベルの抽象化を見たいと思いますか? –

+0

残念ながら、私は他のAPIの使用の提案に感謝しながら、私はスレッドを使用してこれを行う必要がありますthread.join()=/ – Jake

答えて

3

Future APIは、必要な処理を行う必要があります。

futureは、 の非同期計算の結果を表します。計算が であるかどうかを確認し、 の完了を待ち、計算の結果である を検索する方法は、 です。計算結果が の場合は、 を使用して を取得することができます。 の準備が完了するまで、必要な場合はブロック がブロックされます。キャンセル方法は でキャンセルします。追加の方法 は、タスク が正常に完了したか、またはキャンセルされたかを判断するために提供されています。 計算が完了すると、 の計算をキャンセルできません。 キャンセルのために未来を使用したいが、 に使用可能な結果を​​提供しない場合は、元のタスクの結果としてタイプ を未来型として宣言し、null を返すことができます。

1

これは、スレッドの開始と結合には適切ではないと思います。代わりにスレッドプールを使用する必要があります。

以下は、スレッドプールを示すコードのサンプルです。

ExecutorService workers = Executors.newFixedThreadPool(10); 

for(int i=0; i<input.length; i++) { 
    Teste task = new Teste(rowArray,max); 
    workers.execute(task); 
} 

workers.shutdown(); 
while(!workers.isTerminated()) { 
try { 
    Thread.sleep(10000); 
    } catch (InterruptedException exception) { 

    } 
    System.out.println("waiting for submitted task to finish operation"); 
} 

このヘルプが必要です。

+0

sleep()の問題は、常に10秒待つことです。できるだけ早く停止するawaitTermination(10、TimeUnit.SECONDS)を使用することをお勧めします。 –

+0

さらに、少なくとも10コアを持たない限り、コアよりもスレッド数が多いため、CPUを多用する作業に時間がかかる可能性があります。 –

+0

はい、そうです。私は例を挙げました。要件ごとに調整する必要があります。 – nIKUNJ

0

アレイがかなり大きい場合を除き、1つのスレッドで検索するほうが速くなります。しかし、1000s以上であれば、簡単にタスクを管理できるExecutionServiceを使用することをお勧めします。

しかし、最も簡単な変更は、結果をAtomicLongに保存することです。その結果、Runnablesは結果を返す必要がありません。

0

最大行を保持する「teste」クラスに新しいフィールドを追加できます。メインスレッドはx.join()で停止するので、その行の後にそのフィールドを参照して最大値を取得できます。

. 
. 
. 
int max=0; 
for (Thread x : threads) 
{ 
     x.join(); 
     max=x.getMax(); 
} 
. 
. 
. 
関連する問題