【问题标题】:java program crashes at Scanner initializationjava程序在扫描仪初始化时崩溃
【发布时间】:2016-05-30 00:06:49
【问题描述】:

我正在使用扫描仪从文件中读取行并根据给定的模式替换每行中的一些文本。这是在 API 中完成的。我的程序是一个多线程的。一次,多个线程可以调用这个特定的 API。

以下是线程崩溃的行扫描器初始化行:

public static void replaceInFile(Properties replacements, Path targetFile) {
    ...
    Scanner in = new Scanner(targetFile, "UTF-8");
    ...
}

我确信两个线程不会同时访问单个文件。任何人都可以向我暗示正在发生的事情的正确方向吗?

更新:

public Void call() throws Exception {
        Iterator it = paths.iterator();
        while(it.hasNext()){
          try {
            String filePath = it.next().toString();
            //BuildUtil replacer = new BuildUtil();
            BuildUtil.replaceInFile(replacements, Paths.get(filePath));
          } catch(Exception e) {
             e.printStackTrace();
          }
}

这是线程的 call()。现在我观察到它甚至在进入 BuildUtils 的 replaceInFile 方法之前显示“框架不可用”,有时在进入那里之后..我无法弄清楚出了什么问题..我认为主线程正在退出,但我什么也没看到这里发生了奇怪的事情,应该让它意外退出。

【问题讨论】:

  • 假设“崩溃”是指抛出异常,您能否包含异常详细信息
  • 对不起,我的意思是程序刚刚退出。我的调试器在“框架不可用”的行中说了些什么……
  • 我认为您需要在这里分享更多代码。基于以上两行的任何内容都是猜测......
  • 我会尽快更新。同时,当我单步执行在不同包中定义的 API 时,它会将我引导至 .class 文件。有什么方法可以进入实际的源文件进行调试?我正在使用 IntelliJ 编辑器
  • 如果整个应用程序都退出了,是什么让你如此确信这个线程,执行发布的行,是原因?

标签: java multithreading thread-safety java-8 java.util.scanner


【解决方案1】:

我找到了。其实这是我的愚蠢。我忘了等待线程退出,所以主线程甚至在线程完成之前就退出了。打扰了!

所以现在我这样做了:

for (int i = 0; i < threadsUsed; i++) {
  pool.take().get();
}

对于所有线程并在 finally 块中关闭执行器服务

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多