当前位置: 首页 > 知识库问答 >
问题:

线程在执行过程中突然死亡

经博延
2023-03-14

我有一个java控制器,它调用一个服务,负责100次外部呼叫的繁重任务,从所有这些呼叫中收集数据,处理它们,最后以csv格式发送数据。

由于有很多外部调用,完成整个过程所花费的时间很大。所以我创建了一个线程,并将此任务交给该线程执行,主线程立即退出。

    Runnable task = () -> {
        try {
            service.createReport(startTime, endTime);
        } catch (IOException e) {
            log.error(e);
        }
    };

    Thread thread = new Thread(task);
    thread.setPriority(10);
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(thread);
    executor.shutdown(); 

这里的问题是,我创建的用户线程开始执行和调用外部apis,由于某种原因,它突然终止,也没有任何错误/异常。正如我在日志中看到的那样,它只是在调用所有外部apis之间停止。此外,当我执行这一短时间时,将有较少的外部调用,它执行成功。

请求帮助!!

共有1个答案

左丘修齐
2023-03-14

这真的应该是一个注释,而不是一个答案,但我不能在注释中格式化代码。

当您只想执行单个任务时,为什么要创建线程池?为什么不干脆这样做呢?

Thread thread = new Thread(() -> {
    try {
        service.createReport(startTime, endTime);
    } catch (IOException e) {
        log.error(e);
    }
)};
thread.start();

另一方面,如果程序将经常执行相同的任务,那么让线程池保持活动状态,而不是为任务的每次调用创建和销毁一个新的线程池可能是有意义的:

final ExecutorService executor = Executors.newSingleThreadExecutor();
...
executor.submit(() -> {
    try {
        service.createReport(startTime, endTime);
    } catch (IOException e) {
        log.error(e);
    }
});
// executor.shutdown();  // DON'T DO THIS! Keep it alive for next time.
 类似资料:
  • 更新了问题和图像。 是否有任何方法可以暂停所有线程,直到任何线程执行samplerA为止(不管线程数是多少,这只需要执行一次),在执行这个sampler之后,所有线程都可以继续执行。单击以获取图像

  • 问题内容: 当使用and 对象时(提交任务时),如果我为将来的get函数指定一个超时值,则抛出a时基础线程会被杀死吗? 问题答案: 它不是。为什么会这样?除非你告诉。 例如,在有Callable的情况下,存在一个非常有效的担忧。如果您等待结果说20秒钟却没有得到结果,那么您对结果不再感兴趣。那时您应该完全取消任务。 像这样:

  • 问题内容: 我写了一个存储过程,昨天通常在不到一秒钟的时间内完成。今天,大约需要18秒。我昨天也遇到了这个问题,似乎可以通过删除并重新创建存储过程来解决。如今,这种技巧似乎没有奏效。:( 有趣的是,如果我复制存储过程的主体并将其作为直接查询执行,它将很快完成。它似乎是一个存储过程,正在减慢它的速度……! 有谁知道可能是什么问题?我一直在寻找答案,但是通常他们建议通过Query Analyser运行

  • 我有几个关于Django的项目,在hi runserver终端显示之后: 我更新了所有用于苹果M1的库,一切都很好。几天后,我试着跑步,但一切都被压碎了。我的requirements.txt是: python3的版本是3.9.1 当我在PyCharm中运行代码时,会显示: 我读到SIGKILL的问题可能与内存有关,但我的内存有一半是免费的~5GIG使用3GIG免费的

  • 我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....

  • 这是一个关于Java中多线程的初学者问题。 根据我的理解,当创建多个(用户)线程来运行程序或应用程序时,就没有父线程和子线程的概念。它们都是独立的用户线程。 因此,如果主线程完成执行,那么另一个线程(Thread2)仍将继续执行,因为在Thread2的执行线程完成之前,它不会被JVM杀死(https://docs.oracle.com/javase/6/docs/api/java/lang/Thr