Создание фоновой задачи в плагине IntelliJ

Я разрабатываю плагин IntelliJ-idea и хочу запускать код в фоновой задаче (видимый в диалоговом окне фоновых задач и в другом потоке, чем пользовательский интерфейс).

Я нашел следующий класс помощника и попробовал его, передав объект Runnable и внедряя его метод запуска, но он все еще блокирует пользовательский интерфейс, и когда я пытался выполнить потоковую обработку я получил следующую ошибку

 Read access is allowed from event dispatch thread or inside read-action only (see com.intellij.openapi.application.Application.runReadAction())
     Details: Current thread: Thread[Thread-69 [WriteAccessToken],6,Idea Thread Group] 532224832
     Our dispatch thread:Thread[AWT-EventQueue-1 12.1.4#IU-129.713, eap:false,6,Idea Thread Group] 324031064
     SystemEventQueueThread: Thread[AWT-EventQueue-1 12.1.4#IU-129.713, eap:false,6,Idea Thread Group] 324031064

Ответ 1

Я нашел лучший способ запустить процесс в качестве фоновой задачи, где вы можете обновить процент выполнения и текст индикатора.

ProgressManager.getInstance().run(new Task.Backgroundable(project, "Title"){
        public void run(@NotNull ProgressIndicator progressIndicator) {

            // start your process

            // Set the progress bar percentage and text
            progressIndicator.setFraction(0.10);
            progressIndicator.setText("90% to finish");


            // 50% done
            progressIndicator.setFraction(0.50);
            progressIndicator.setText("50% to finish");


            // Finished
            progressIndicator.setFraction(1.0);
            progressIndicator.setText("finished");

        }});

Если вам нужно прочитать некоторые данные из другого потока, вы должны использовать

AccessToken token = null;
try {
   token = ApplicationManager.getApplication().acquireReadActionLock();
                    //do what you need
} finally {
   token.finish();
}

Ответ 2

Вот общее решение

ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
    public void run() {
        ApplicationManager.getApplication().runReadAction(new Runnable() {
            public void run() {
            // do whatever you need to do
            }
        });
    }
});