[英]Defining a file path for an executor service
我正在编写一个程序,它将接受用户对文件的输入,即:
if (option == 1) {
System.out.print("Enter text file path: ");
bookFile = scanner.next();
}
定义文件路径后,它将进入执行程序:
// Parse book file concurrently
executor.execute(() -> {
try {
parseBookFile(bookFile, wordIndex);
} catch (Exception e) {
e.printStackTrace();
}
});
我遇到的问题是 bookfile 有下划线说明:在封闭范围内定义的局部变量 bookFile 必须是最终的或有效的最终的
而且我似乎找不到解决这个问题的方法,因为文件路径在定义它之前不能是最终的。 唯一有用的是使用执行程序本身定义文件路径,但这确实会扰乱程序的其余部分
我试图在执行程序中定义文件路径,但它没有成功,因为下一个代码块正在定义更多文件路径,但如果有意义,用户必须选择这样做。
看起来您面临的问题是由匿名内部类(即 execute 方法的 lambda 函数)中使用 bookFile 变量这一事实引起的。 在 Java 中,如果在匿名内部类中使用局部变量,则必须将其标记为 final 或有效的 final。
解决此问题的一种方法是将 bookFile 变量定义为封闭类的一个字段,而不是 if 块中的局部变量。 这样,可以从匿名内部类中访问和修改变量而不会出现任何问题。
或者,您也可以使用方法参数将 bookFile 的值传递给匿名内部类,而不是将其作为局部变量访问。 例如:
executor.execute(() -> { try { parseBookFile(bookFile, wordIndex); } catch (Exception e) { e.printStackTrace(); } });
我希望这有帮助。 如果您还有其他问题,请告诉我。
一种可能的解决方案是使用实现 Runnable 的类,以便按如下方式传递变量:
class MyJob implements Runnable{
private final int wordIndex;
private final String bookFile;
public MyJob(String bookFile,int wordIndex){
this.wordIndex = wordIndex;
this.bookFile = bookFile;
}
public void run(){
try {
parseBookFile(bookFile, wordIndex);
} catch (Exception e) {
e.printStackTrace();
}
}
}
所以,你可以这样运行一个线程:
executor.execute( new MyJob(bookFile,wordIndex));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.