멀티 스레딩을 사용하여 이번에 만 완료 한 작업을 수행하고 싶습니다. 파일에서 한 줄씩 많은 양의 데이터를 읽고 각 줄의 정보를 얻어 맵에 추가해야합니다. 이 파일은 백만 라인 이상이므로 멀티 스레딩의 이점을 누릴 수 있다고 생각했습니다.멀티 스레딩을 효과적으로 사용하는 방법
Java에서 멀티 쓰레딩을 한 번도 사용해 본 적이 없기 때문에 여기에 대한 방법은 확실하지 않습니다. main 메소드에 읽기를 수행 한 다음 다른 스레드로 읽은 행을 제공하여 String을 형식화 한 다음 다른 스레드에 전달하여 맵에 넣고 싶습니다.
public static void main(String[] args)
{
//Some information read from file
BufferedReader br = null;
String line = '';
try {
br = new BufferedReader(new FileReader("somefile.txt"));
while((line = br.readLine()) != null) {
// Pass line to another task
}
// Here I want to get a total from B, but I'm not sure how to go about doing that
}
public class Parser extends Thread
{
private Mapper m1;
// Some reference to B
public Parse (Mapper m) {
m1 = m;
}
public parse (String s, int i) {
// Do some work on S
key = DoSomethingWithString(s);
m1.add(key, i);
}
}
public class Mapper extends Thread
{
private SortedMap<String, Integer> sm;
private String key;
private int value;
boolean hasNewItem;
public Mapper() {
sm = new TreeMap<String, Integer>;
hasNewItem = false;
}
public void add(String s, int i) {
hasNewItem = true;
key = s;
value = i;
}
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
if (hasNewItem) {
// Find if street name exists in map
sm.put(key, value);
newEntry = false;
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
// I'm not sure how to give the Map back to main.
}
}
올바른 접근 방식을 취하고 있는지 확실하지 않습니다. 또한 매퍼 스레드를 종료하고 기본 맵을 검색하는 방법을 알지 못합니다. 여러 매퍼 스레드가 있지만 위의 코드에서 하나만 인스턴스화했습니다.
또한 Parse 클래스가 스레드가 아니라 run() 메서드를 재정의하지 않으면 다른 클래스 만 인식하므로 Parse 클래스가 일종의 대기열이어야한다고 생각합니다.
아이디어가 있습니까? 감사.
편집 : 답장을 보내 주셔서 감사합니다. I/O가 주요 병목 지점이 될 것이므로이를 병렬화하면 효율성 이점이 거의 없을 것으로 보입니다. 그러나 데모 용으로 올바른 방향으로 가고 있습니까? 나는 멀티 스레딩을 사용하는 방법을 알지 못해서 약간 괴롭다.
파일에서 읽는 것이 코드 병목 목입니다. 멀티 스레딩은 여기서 도움이되지 않습니다. –
멀티 스레딩을 사용하면 여기에서 발을 쏠 수 있습니다. @HovercraftFullOfEels가 지적한 것처럼 스레드가 디스크 IO 속도보다 훨씬 빠르게 실행될 수 있습니다. 어떤 스레드가 얼마나 많은 행을 읽었는지 어떻게 관리 할 계획입니까? 예기치 않은 이유로 하나 이상의 스레드가 실패하면 어떻게됩니까? 하나의 스레드에서 하나의 파일을 처리하고 현재 사용중인 컴퓨터를 기반으로하는 처리 방법을 선택하는 것이 좋습니다. 128 기가 램이 장착 된 서버를 가지고 있다면 메모리에 읽어 와서 한 라인 씩 처리하지 않으면 처리하십시오. – JVXR