私のコード ベースは非常に大きいので、ここではできるだけ簡潔にまとめます。
私は、 a がRunnable
a 内で実行を終了すると、 と のThread
両方が破棄されると仮定しています。これは、 内のコードが線形コードであるためです。おそらくいくつかの関数呼び出しですが、間違いなくループはありません。Thread
Runnable
Runnable
問題は、Thread
実行中のままであることですが、実行すべきではないと思います。
の作成RunnableProcessor
:
Controller.getInstance().getNamedThreadFactory().addThreadName("EST: " + runnableProcessor.toString());
Controller.getInstance().getExecutorService().execute(runnableProcessor);
RunnableProcessor
クラス:
public class RunnableProcessor<T> implements Runnable {
private final Processor<T> processor;
private final T object;
public RunnableProcessor(final Processor<T> processor, final T object) {
this.processor = processor;
this.object = object;
}
@Override
public void run() {
processor.process(object);
}
@Override
public String toString() {
return "RunnableProcessor(\"" + processor + "\", \"" + object.toString() + "\")";
}
}
そのような の例Processor
、つまりInputProcessor
:
public class InputProcessor implements Processor<File> {
private static final String PDF = "pdf";
@Override
public void process(File file) {
if (new CustomPath(file).getExtension().equalsIgnoreCase(PDF)) {
processPdf(file);
}
else {
processImage(file);
}
}
private void processPdf(final File file) {
System.out.println("Processing " + file.toString());
FileEditor.convert(file);
Utils.move(file.toPath(), new File(Controller.DONE_URL + File.separator + file.getName()).toPath());
System.out.println("Processed");
}
private void processImage(final File file) {
//Skew detection
System.out.println("Rotating " + file.toString());
SkewDetector skewDetector = new SkewDetector(file);
File rotatedFile = skewDetector.detect();
Utils.move(rotatedFile.toPath(), new File(Controller.ROTATED_INPUT_URL + File.separator + rotatedFile.getName()).toPath());
System.out.println("Rotated");
}
@Override
public String toString() {
return "InputProcessor";
}
}
コード内の何も実行をブロックしません。つまり、この場合、特定の文字列Processed
またはRotated
すべてが に出力されます。System.out
その後、特定の文字列はThread
まだ停止しません。これはたとえば、実行が終了したにもかかわらず、まだ生きているスレッドの 1 つです。Runnable
名前は:EST: RunnableProcessor("InputProcessor", "D:\OCR\renamed_input\682-converted.tiff")
です。
スレッドの動作は、2 分間にわたって測定されたものですが、興味深いようです: 次の順序に従います: 短時間実行、短時間監視、長時間実行、クイック モニター、短時間実行、非常に長い待機、比較的短い実行、非常に長い待機、比較的短い走って、待って(永遠まで?)。
正確に何が起こっているのかを理解するのを手伝ってくれる人はいますか?