2014-05-21 2 views
5

나는 다음 운동 질문에서 온 첫 번째 챕터의 책 "정말 참을성이 자바 SE 8"을 읽고 있어요 :배열 정렬 방법의 동작

이 배열의 비교 코드입니다. 정렬 또는 다른 스레드에 대한 호출과 동일한 스레드에서 호출 된 정렬 메소드?

javadoc에서 Comparator 인수를 사용하지만 스레드에 대해 아무것도 지정하지 않는 Arrays.sort 오버로드를 검색했습니다. 성능상의 이유로 코드가 다른 스레드에서 실행될 수 있다고 추측하지만 그것은 단지 추측입니다.

+5

동일한 스레드에서 호출되었습니다. –

답변

5

idThread.currentThread() 로깅하여 언제든지 테스트 할 수 있습니다.

sort()compare() 메서드를 호출하기 전에이 내용을 추가하십시오. 먼저 배열을 정렬 것 - 다른 스레드에서 산란 된 정렬하면, 당신은 경쟁 조건을 가지고 싶다면

int[] array = new int[] {.........}; 
/// Few/many lines of code between... 
Arrays.sort(array); 
int largest = array[array.length - 1]; 

:

logger.debug("Thread # " + Thread.currentThread().getId()); 
+2

이것을 시도한 후에는 효과적으로 동일한 스레드에서 실행됩니다. – enrique7mc

4

하면 배열에서 가장 큰 요소를 얻기 위해 코드가 상상 또는 largest이 먼저 할당 되나요? array을 잠그면 문제를 피할 수 있지만 이미 실행중인 코드가 array으로 잠겨 있다면 어떻게 될까요? join()을 사용하여 원래 스레드를 차단할 수 있지만 추가 스레드가 생성되지 않은 것처럼 코드가 정확히 동일한 방식으로 작동하므로 다른 스레드를 생성하는 목적을 거의 무시했습니다.

Arrays#sort()의 경우 다른 스레드를 생성하는 데별로 도움이되지 않기 때문에 원래 스레드에서 정렬이 이루어집니다. 스레드는 다른 코드와 마찬가지로 정렬이 완료 될 때까지 차단됩니다.

다른 스레드를 정렬하는 가장 가까운 방법은 Java 8에 도입 된 Arrays#parallelSort() 메서드입니다.이 작업은 여전히 ​​정렬이 완료 될 때까지 현재 스레드를 차단하므로 보통 Arrays#sort()과 거의 동일하게 작동합니다. 배열을 정렬하는 데 도움이되는 백그라운드에서 생성 된 스레드. 대용량 데이터 세트의 경우 생성 된 쓰레드 수를 줄이고 어떤 쓰레딩 오버 헤드가 있는지를 예상 할 수 있습니다.

+1

스레딩은'sort'에서 발생합니다. 'sort'는 리턴하기 전에 생성 한 쓰레드에 합류합니다. –

+0

@SotiriosDelimanolis 그러나'sort()'에 대해서, 어쨌든 원래의 스레드를 막으려한다면 다른 스레드를 생성 할 수있는 포인트는 무엇입니까? – awksp

+0

@SotiriosDelimanolis 아 잠깐, 당신이 말하는 것을 볼 수 있습니다 ... 내 대답을 편집하게하십시오. – awksp

0

첫 번째 테스트에서 코드는 단일 스레드로 실행됩니다.

두 번째 테스트에서 코드는 여러 스레드에서 실행됩니다.

@Test 
public void shouldSortInSingleThread() { 

    List<String> labels = new ArrayList<String>(); 
    IntStream.range(0, 50000).forEach(nbr -> labels.add("str" + nbr)); 
    System.out.println(Thread.currentThread()); 
    Arrays.sort(labels.toArray(new String[] {}), (String first, 
      String second) -> { 
     System.out.println(Thread.currentThread()); 
     return Integer.compare(first.length(), second.length()); 

    }); 

} 

@Test 
public void shouldSortInParallel() { 

    List<String> labels = new ArrayList<String>(); 
    IntStream.range(0, 50000).forEach(nbr -> labels.add("str" + nbr)); 

    System.out.println(Thread.currentThread()); 
    Arrays.parallelSort(labels.toArray(new String[] {}), (String first, 
      String second) -> { 
     System.out.println(Thread.currentThread()); 
     return Integer.compare(first.length(), second.length()); 

    }); 

}