2012-06-11 2 views
0

이미지를 계산할 때 멀티 스레딩을 사용하고 있습니다. 모든 스레드는 스레드가 이미 을 계산할 때 다음 스레드가 해당 행을 계산해야 할 때 하나의을 계산합니다. 하지만 모든 행을 한 번만 계산하면됩니다. 그렇게하려면 System.out.println (CalculatedLineNumber)을 만들고 텍스트 파일로 출력을 만들면 텍스트로 열 때 편집기에서 인쇄 된 줄 수가 텍스트 파일과 같은지 직접 확인합니다. 하지만 어떻게해야합니까? 다음은 계산이 이루어집니다 run() 메소드 내 코드 조각입니다 :PrintWriter 및 flush()를 사용하여 텍스트 파일에 무언가를 인쇄하는 방법?

public void run() { 

       int myRow; 
       while ((myRow = getNextRow()) < getHeight()) { 
        image.setRGB(0, myRow, getWidth(), 1, renderLine(myRow), 0, 0); 
       } 
      } 

누군가가 내가 그런의 PrintWriter와 플러시() 또는 뭔가를 사용해야한다는 얘기하지만, 내가 사용하는 방법을 잘 모릅니다 그 .. 누가 그걸 도와 줄 수 있니? ("myRow"는 텍스트 파일에 줄 바꿈을하려는 줄 번호이고, 다른 줄에있는 모든 사람)

고마워요 !!

+0

난 당신이 ['RandomAccessFile'] (http://docs.oracle.com/javase/6/docs/api/java/io/RandomAccessFile.html)를 필요가 있다고 생각합니다. –

답변

1

나는, 모든 라인이 한 시간을 계산 얻을 있는지 확인하려면

나는 당신이 ExecutorService을 사용하는 것이 좋습니다 스레드의 풀에 이미지 작업으로 각 행을 제출하는 것입니다. 코드 샘플은 하단을 참조하십시오. 이 작업을 올바르게 수행하면 출력 라인 수를 걱정할 필요가 없습니다.

나는 System.out.println(CalculatedLineNumber)

내가 아주 이것에 대한 필요성을 이해하지 못하는 만들 수 있습니다. 이것은 모든 이미지가 처리되었는지 확인하는 데 도움이되는 일종의 회계 파일입니까?

누군가가 내가 이미 아래에 동기화되어 있기 때문에 당신은 flushPrintWriter 필요없는의 PrintWriter와 플러시()

를 사용한다고 내게 말했다. 각 작업이 끝날 때마다 결과를 출력하고 X 행 작업을 threadPool에 제출하면 출력 X 행을 갖게됩니다.

당신이 PrintWriter를 사용하기 위해 필요한 모든

은 다음과 같습니다

PrintWriter printWriter = new PrintWriter(new File("/tmp/outputFile.txt")); 
// each thread can do: 
writer.println("Some sort of output: " + myRow); 

여기 ExecutorService 스레드 풀을 사용하는 방법을 보여주는 몇 가지 예제 코드입니다.

PrintWriter outputWriter = ...; 
// create a thread pool with 10 workers 
ExecutorService threadPool = Executors.newFixedThreadPool(10); 
// i'm not sure exactly how to build the parameter for each of your rows 
for (int myRow : rows) { 
    // something like this, not sure what input you need to your jobs 
    threadPool.submit(new ImageJob(outputWriter, myRow, getHeight(), getWidth())); 
} 
// once we have submitted all jobs to the thread pool, it should be shutdown 
threadPool.shutdown(); 
... 
public class ImageJob implements Runnable { 
    private PrintWriter outputWriter; 
    private int myRow; 
    private int height; 
    private int width; 
    public MyJobProcessor(PrintWriter outputWriter, int myRow, int height, 
      int width, ...) { 
        this.outputWriter = outputWriter; 
        this.myRow = myRow; 
        this.height = height; 
        this.width = width; 
    } 
    public void run() { 
     image.setRGB(0, myRow, width, 1, renderLine(myRow), 0, 0); 
     outputWriter.print(...); 
    } 
} 
+0

안녕하세요 회색, 당신의 아주 좋은 답변 주셔서 감사합니다.하지만 내가 생각하는 것이 훨씬 쉽습니다 : 그것은 단지'System.out.println (myRow)'while 루프에 있습니다. 하지만 콘솔에 너무 많은 줄이 있으므로이 출력을 Textfile에 저장하는 것이 좋습니다. 그냥 복잡한 일없이 - 어떻게해야합니까? - 감사합니다! – ZelelB

+0

허. 승인. 'PrintWriter'의 사용법을 추가했습니다. 그게 네가 필요한거야? – Gray

+0

그래, 고마워 ..하지만 여전히 문제가있다 : 이클립스는'PrintWriter printWriter = new PrintWriter (new File ("outputFile.txt"));'에 의해 "처리되지 않은 FileNotFoundException"을 알려준다.내가 "run()"에 추가 할 때 FileNotFoundExcpetion 이클립스가 그것을 내버려 둬 내가 어떻게해야합니까? – ZelelB

관련 문제