2014-05-21 17 views
5

Tôi đang đọc cuốn sách "Java SE 8 cho sự thiếu kiên nhẫn", trong chương đầu tiên tôi đi qua với các câu hỏi bài tập tiếp theo:Mảng cách sắp xếp hành vi

Là mã so sánh trong các mảng. phương pháp sắp xếp được gọi trong cùng một chuỗi với lời gọi sắp xếp hoặc một chuỗi khác?

Tôi đã tìm kiếm javadoc để quá tải Arrays.sort lấy đối số Comparator nhưng không chỉ định bất kỳ điều gì về chủ đề. Tôi giả định rằng vì lý do hiệu suất mà mã có thể được thực hiện trong một chủ đề khác, nhưng nó chỉ là một phỏng đoán.

+5

Được gọi trên cùng một chuỗi. –

Trả lời

5

Bạn luôn có thể kiểm tra bằng cách đăng nhập id của Thread.currentThread().

Thêm nội dung này ngay trước khi gọi sort() và trong phương thức compare() của bạn.

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

Sau khi thử điều này, có hiệu quả chúng chạy trong cùng một luồng – enrique7mc

4

Hãy tưởng tượng bạn có mã để có được những phần tử lớn nhất trong một mảng:

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

Nếu sắp xếp được sinh ra trong chủ đề khác, bạn muốn có một tình trạng chủng tộc - bạn sẽ sắp xếp mảng đầu tiên , hoặc sẽ largest được chỉ định trước? Bạn có thể tránh sự cố đó bằng cách khóa array, nhưng điều gì sẽ xảy ra nếu mã bạn đang chạy trong khóa đã bị khóa array? Bạn có thể chặn chuỗi ban đầu bằng cách sử dụng join(), nhưng sau đó bạn đã đánh bại khá nhiều mục đích sinh ra một chuỗi khác, vì mã của bạn sẽ hoạt động chính xác theo cùng cách như thể không có chuỗi bổ sung nào sinh ra.

Đối với Arrays#sort(), việc sắp xếp diễn ra trong chuỗi ban đầu, vì thực sự không có nhiều điểm trong việc sinh ra một chuỗi khác. Chuỗi của bạn sẽ chặn cho đến khi sắp xếp xong, giống như bất kỳ đoạn mã nào khác.

Điều gần nhất để sinh ra một chuỗi khác để sắp xếp là phương pháp Arrays#parallelSort() được giới thiệu trong Java 8. Điều này vẫn hoạt động khá giống với thường lệ Arrays#sort(), vì nó chặn chuỗi hiện tại của bạn cho đến khi sắp xếp xong, nhưng có chủ đề sinh ra trong nền để giúp sắp xếp mảng. Đối với các tập dữ liệu lớn hơn, tôi mong đợi một sự cải thiện xung quanh số lượng các chủ đề được sinh ra, trừ đi bất cứ luồng nào có thể có.

+1

Luồng sẽ xảy ra bên trong 'sắp xếp'. 'sort' sẽ tham gia vào các chủ đề mà nó tạo ra trước khi trở về. –

+0

@SotiriosDelimanolis Nhưng đối với 'sort()', điểm của việc sinh ra một chuỗi khác là gì nếu bạn chỉ định chặn luồng gốc? – awksp

+0

@SotiriosDelimanolis Ồ, chờ đã, tôi hiểu bạn đang nói gì ... Hãy để tôi chỉnh sửa câu trả lời của tôi. – awksp

0

Trong thử nghiệm đầu tiên, mã sẽ chạy trong một chuỗi.

Trong thử nghiệm thứ hai, mã sẽ chạy trong nhiều Chủ đề.

@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()); 

    }); 

} 
Các vấn đề liên quan