すべての行が一度だけ計算されるようにしたいのですが、
ExecutorService
を使用して、各行を画像ジョブとしてスレッドプールに送信することをお勧めします。コードサンプルについては、下部を参照してください。これを正しく行うと、出力行がいくつになるかを心配する必要はありません。
私は作ることができますSystem.out.println(CalculatedLineNumber)
私はこれの必要性を完全には理解していません。これは、すべての画像が処理されたことを確認するのに役立つ、ある種のアカウンティングファイルですか?
誰かが私にPrintWriterとflush()を使うべきだと言った
すでに下で同期されflush
ているので、する必要はありません。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(...);
}
}