0

マルチスレッドを使用して画像を計算しています。スレッドがすでにlineを計算している場合、次のスレッドがその次の行を計算する必要がある場合、すべてのスレッドは行を計算します。しかし、すべての行が一度だけ計算されることを確認したいのですが、それを行うには、System.out.println(CalculatedLineNumber) を作成し、テキスト ファイルで出力を作成して、テキストで開いたときにエディター、印刷された行数がテキストファイルの行数と同じかどうかを直接確認します。しかし、どうすればいいですか?以下は、計算が行われる run() メソッドのコード フラグメントです。

public void run() {

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

PrintWriter と flush() などを使用する必要があると誰かに言われましたが、その使用方法がわかりません..誰かがそれを手伝ってくれますか? (「myRow」はテキストファイルに書きたい行番号で、全員別行)

どうもありがとう!!

4

1 に答える 1

1

すべての行が一度だけ計算されるようにしたいのですが、

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(...);
    }
}
于 2012-06-11T19:36:58.180 に答える