2012-02-25 3 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')이 어떤 식 으로든 스레드 안전하지 않습니다. –

+0

숙제 가정합니까? – Jivings

답변

0

좋은 시작입니다. 다음으로해야 할 일은 검색 범위의 시작과 끝을 나타내는 두 개의 멤버 변수 인 FindMax을주는 것입니다. for 루프에는 1N 대신에 두 개의 멤버 변수를 사용하십시오. 그런 다음 FindMax에 두 값을 설정할 수있는 생성자를 지정합니다. 그런 다음 개체를 생성하는 루프에서 각 개체에 고유 한 검색 범위를 지정하십시오. 마지막으로 FindMax에 최대 값을 저장할 멤버 변수를 지정하면 main()은 각 FindMax에서 찾을 수있는 최대 값을 쿼리 할 수 ​​있습니다.

Thread 클래스의 join() 메서드를 사용하는 것이 좋습니다. 반환하기 전에 Thread이 완료 될 때까지 기다립니다.

+0

감사합니다! 나는 그것을 끝냈다. 그러나 그것은 반대되는 원하는 효과를 가지고있다. 이 코멘트 상자에 코드를 입력 할 수 없으므로 여기에 새 질문을 게시했습니다. http://stackoverflow.com/questions/9448587/why-does-this-programs-speed-not-increase – user1231972