gpt4 book ai didi

java - Runnable 的线程在执行后不会被销毁

转载 作者:行者123 更新时间:2023-11-29 05:34:38 32 4
gpt4 key购买 nike

我的代码库很大,所以我会尽量把它放在这里。

我假设如果 RunnableThread 中完成执行,那么 ThreadRunnable 将被销毁,因为 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";
}
}

代码中没有任何内容阻止执行,即在这种情况下,特定字符串 ProcessedRotated 都被打印到 System.out,之后特定的 Thread 仍然没有死。例如,即使 Runnable 的执行已完成,其中一个线程仍处于 Activity 状态,名称为:EST: RunnableProcessor("InputProcessor", "D:\OCR\renamed_input\682-converted.tiff").

线程的行为,经过两分钟的测量,看起来很有趣:它遵循以下顺序:短时间运行,短时间被监视,长时间运行,快速监视,短时间运行,等待很长时间,相对短时间运行,等待很长时间,相对短跑,等待(直到永恒?)。

谁能帮忙弄清楚到底发生了什么?

最佳答案

您似乎在使用执行程序服务。虽然它可以实现为每个任务创建新线程,但显然在您的情况下,它是使用线程池实现的,该线程池使线程等待新任务运行。根据the documentation这样做是为了获得更好的性能。

无论如何,您不应该依赖执行程序服务的内部工作。如果您需要在任务完成时收到通知,我建议您监控任务或包装器。

如果你想创建一个新的包装器并且似乎正在轮询(线程状态)无论如何它可以像这样简单:

void run() {
innerRunner.run(); // the wrapped runner
doneFlag = true; // a boolean indicating the status
}

关于java - Runnable 的线程在执行后不会被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19948927/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com