我正在使用多线程来计算图像。每个线程计算一条线,当线程已经在计算线时,如果下一个线程计算了一个之后的线。但是我想确保每一行都只计算一次,为了实现这一点,我可以创建一个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”是我想在文本文件上写入的行号,以及不同行中的每个人)
非常感谢!!
答案 0 :(得分:1)
我想确保每一行只计算一次,
我建议你使用ExecutorService
并将每一行作为图像作业提交给一个线程池。请参阅底部以获取代码示例。如果你这样做,那么你不必担心会有多少输出线。
我可以制作
System.out.println(CalculatedLineNumber)
我不太明白这个需要。这是某种会计文件,以帮助您确保所有图像都已处理?
有人告诉我应该使用PrintWriter和flush()
您不需要flush
PrintWriter
,因为它已在下方同步。只需在每个作业结束时打印出结果,如果您向threadPool
提交了X行作业,那么您将有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(...);
}
}