[英]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.