繁体   English   中英

为执行程序服务定义文件路径

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM