2012-02-25 61 views
1

我給出了以下代碼,該代碼會生成一個大數組並找到最大值。搜索數組的一部分的多個線程

import java.util.Date; 
import java.util.Random; 

class FindMax { 
private static final int N = 256 * 1024 * 1024; 

public static void main(String args[]) { 
    assert(N > 0); 

    int array[] = new int [N]; 

    assert(array != null); 

    Random random = new Random(new Date().getTime()); 

    for (int i = 0; i < N; i++) { 
     array[i] = random.nextInt(); 
    } 

    Date start = new Date(); 

    int max = array[0]; 

    for (int i = 1; i < N; i++) { 
     if (array[i] > max) { 
      max = array[i]; 
     } 
    } 

    Date end = new Date(); 

    System.out.println("max: " + max); 
    System.out.println("time in msec: " + (end.getTime() - start.getTime())); 
} 
} 

我更改代碼通過使多個線程,每個找到陣列的部分的最大值,然後主線程找到的最高值由線程發現最大值,使其更快。這是我到目前爲止所提出的。

import java.util.Date; 
import java.util.Random; 

class FindMax extends Thread{ 
private static final int N = 256 * 1024 * 1024; 

static int array[] = new int [N]; 
static int max = array[0]; 

public void run(){ 
    for (int i = 1; i < N; i++) { 
     if (array[i] > max) { 
      max = array[i]; 
     } 
    } 

} 

public static void main(String args[]) { 
    assert(N > 0); 
    int ts = Integer.parseInt(args[0]); 


    assert(array != null); 

    Random random = new Random(new Date().getTime()); 

    for (int i = 0; i < N; i++) { 
     array[i] = random.nextInt(); 
    } 

    Date start = new Date(); 

    Thread t[] = new Thread[ts]; 
    for(int p=0; p<ts;p++){ 
     t[p] = new FindMax(); 
     t[p].start(); 
    } 





    Date end = new Date(); 

    System.out.println("max: " + max); 
    System.out.println("time in msec: " + (end.getTime() - start.getTime())); 
} 
} 

我不理解這個,所以我做錯了什麼?

+0

你並不是每個線程都在數組的一部分上運行,結果集('array')也沒有以任何方式進行線程安全。 – 2012-02-25 01:55:42

+0

我假設的作業? – Jivings 2012-02-25 02:07:28

回答

0

你是一個良好的開端。接下來你需要做的是給FindMax類的兩個成員變量來表示要搜索的範圍的開始和結束。使用這兩個成員變量代替for循環中的1N。然後給FindMax一個構造函數,您可以使用它來設置這兩個值。然後在構建FindMax對象的循環中,爲每個對象提供一個獨特的搜索範圍。最後,給FindMax一個成員變量來存儲最大值,以便main()可以查詢每個FindMax發現的最大值。

您可能想要使用Thread類的join()方法 - 它在返回之前等待Thread完成。

+0

謝謝!我完成了它,但它具有相反的預期效果。我無法適應這個評論框中的代碼,所以我在這裏發佈了一個新問題: http://stackoverflow.com/questions/9448587/why-does-this-programs-speed-not-increase – user1231972 2012-02-25 22:21:16