首页 > 解决方案 > 是否可以中断由 ApplicationManager.getApplication().executeOnPooledThread 调用的可运行对象?

问题描述

我目前正在开发一个嵌入 JCEF 以进行前端交互的 IDEA 扩展。一旦用户点击一个按钮,就会执行onQueryin 实现的方法,MessageRouterHandler并执行一项耗时的任务。

耗时的任务在一个方法中实现(在主线程以外的线程上异步,以防 UI 被冻结),并以类似的形式包装

private void task(CefBrowser browser, CefQueryCallback callback) {
    ApplicationManager.getApplication().executeOnPooledThread(() -> {
        ...DETAILED IMPLEMENTATION FOR THE TASK...
    });
}

runnable只包含文件读取相关的操作(用户点击JCEF webview上的另一个按钮选择),与IDE接口无关,这里我没有添加runWriteActionor runReadAction

由于任务可能需要更长的时间,我想为用户的取消订单添加一个按钮。但是,我对扩展开发很陌生,谁能帮我弄清楚如何实现取消功能?非常感谢您的任何建议。

标签: javamultithreadingintellij-ideachromium-embedded

解决方案


一项耗时的任务应在进度指示器下执行,请参阅com.intellij.openapi.progress.ProgressManager。在任务期间,您可以调用com.intellij.openapi.progress.ProgressManager#checkCanceled以查看任务是否已被用户取消。这个调用应该很便宜,所以你可以经常调用它来确保你的进程及时响应用户的取消请求。


推荐阅读