2010-12-10 85 views
1

好吧,所以我試圖找到二維數組的最大元素。我將有一個方法接受2darray作爲參數並找到最大值。它需要找到每行的最大元素作爲一個單獨的線程,以便線程平行運行,然後連接每個線程,並找到最大值以獲得整個二維數組的最大值。現在我遇到的問題是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(); 
} 
} 

如你所見,它創建了一個線程對象的數組列表。然後獲取每一行並調用run()函數,以查找該行的最大值...問題是run()不會返回任何值...那麼我怎樣才能訪問該行的最大值?

+0

也許你想看看期貨或其他更高級別的抽象? – 2010-12-10 09:00:41

+0

不幸的是,雖然我很感謝使用其他API的建議,但我必須使用線程來執行此操作,並且thread.join()=/ – Jake 2010-12-10 17:57:25

回答

3

Future API應該做你所需要的。

Future表示異步計算的結果 。方法是 提供來檢查計算 是否完成,等待它的 完成,並檢索結果 的計算。結果 只能在計算完成時使用方法獲得 進行檢索,如果需要則可以使用 進行阻止,直到準備好 爲止。通過取消方法取消 。提供其他方法 以確定任務 是否正常完成或被取消。 一旦計算完成, 計算不能被取消。如果 您希望使用Future作爲可取消性的 ,但不提供 可用結果,則可以聲明Future形式的 類型,並返回空 作爲基礎任務的結果。

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),如果可以的話,它會提前停止。 – 2010-12-10 09:09:12

+0

此外,除非您至少有10個內核,否則具有比內核更多的線程可能對於CPU密集型任務而言會更慢。 – 2010-12-10 09:10:11

+0

是的,這是正確的。我只是舉了一個例子。必須按照要求調整它。 – nIKUNJ 2010-12-10 09:12:09

0

除非數組相當大,否則在一個線程中執行搜索會更快。然而,說大小是1000s或更多,我建議你使用ExecutionService這是一個簡單的方法來管理任務。

但是,最簡單的變化是將結果存儲在AtomicLong中,這樣您的Runnables不需要返回結果。

0

您可以在保存最大行的「teste」類中添加一個新字段。主線程在x.join()處停止,所以在該行之後可以引用該字段並獲取最大值。

. 
. 
. 
int max=0; 
for (Thread x : threads) 
{ 
     x.join(); 
     max=x.getMax(); 
} 
. 
. 
.