나는 자바로 멀티 쓰레드를 가르치고있다. 내 더미 예제는 내가 정렬하려는 레코드의 큰 목록 (2D 배열)입니다. 단일 스레드 방식은 루프를 사용하여 레코드 목록을 정렬하고 정렬하는 것입니다. 다중 스레드를 사용하여 프로그램을 고정 소수점 스레드 (이 경우에는 2)로 정렬하려고합니다. 한 스레드는 목록의 첫 번째 절반을 정렬하고 두 번째 스레드는 나머지 절반을 정렬합니다. 이제 정렬 된 레코드 목록의 결과를 출력하고 싶습니다.Java에서 다중 스레드를 사용하여 레코드 목록을 정렬하려면 어떻게합니까?
어떻게 작업자 스레드 풀을 만들고 레코드 목록을 정렬 할 수 있습니까? data
이 공유 리소스가 될까 걱정합니까? 어떻게 각 스레드의 결과를 원래 레코드 목록으로 되돌려 놓을 수 있습니까? 아래는 제 코드입니다.
import java.util.*;
class RunnableProcess implements Runnable {
private int[] data;
public RunnableProcess(int[] data) {
this.data = data;
}
public void run() {
try {
// sort the records this thread has access to
for (int i = 0; i < data.length; i++) {
Arrays.sort(data[i]);
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
class BigData {
static int[][] data = new int[1000][1000];
public static void main(String [] args) {
// Create records
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[0].length; j++) {
data[i][j] = new Random().nextInt(999);
}
}
// Call on two threads to sort the data variable
// ExecutorService executor = Executors.newFixedThreadPool(2);
// Python type of idea: Pass half the records to each thread and start
// java doesn't support this so what is the java way of doing this?
// Thread thread = new Thread(new RunnableProcess(data[:499]));
// thread.start();
// Thread thread = new Thread(new RunnableProcess(data[499:]));
// thread.start();
}
}
나는이 문제를 해결하는 가장 좋은 방법에 열려 제안입니다.
'ArrayList' 및 ['ArrayList <> #subList()']를보십시오 (https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#subList (int , % 20int)) – AJNeufeld
세 번째 단계는 잊었습니다. 정렬 된 결과를 병합하십시오. 병합 정렬 알고리즘을 살펴보십시오! –