Возврат или получение / назначение данных из потока SwingWorker в переменную. начинающий

Я играю с SwingWorker и учусь использовать его. Итак, у меня есть этот код:

ArrayList<Train> dataList = new ArrayList<>();
ArrayList<Train> proccessedData = new ArrayList<>();

String query = "my query, not relevant here";

dataList = myApi.getTrainData(connectServer(), query, false);

TestNewThread tpp = new TestNewThread(dataList, threshold, pairs, false);

tpp.execute();

Мой класс TestNewThread:

public class TestNewThread extends SwingWorker<List, String>{

    private ArrayList<Train> dataList;
    private int threshold
    private int pair
    private boolean processFurther) 

    MyAPI myApi = MyAPI.getInstance();

    public TestNewThread(ArrayList<Train> dataList, int threshold, int pair, boolean processFurther) {
        this.dataList = dataList;
        this.threshold = threshold
        this.pair = pair
        this.iprocessFurther)  = processFurther) 
    }

    @Override
    protected List doInBackground() throws Exception {

        ArrayList<Train> list;

        publish("Starting process");
        list = processingTrains(threshold, pair, dataList);
        publish("Process finished.");

        return list;
    }

    @Override
    protected void process(List<String> chunks) {
        String mostRecentValue = chunks.get(chunks.size() - 1);
        myApi.printPanel("\n"+mostRecentValue);
    }

    @Override
    protected void done() {
//        myApi .printPanel("\nALL DONE... !);
    }

Теперь то, что мне нужно, и я не могу понять, как это сделать: На первой части кода здесь, где я tpp.execute(); Я хочу, чтобы он вернулся к назначенной переменной. Чтобы что-то вроде этого, обратите внимание на комментируемый раздел:

ArrayList resultsList = new ArrayList();
TestNewThread tpp = new TestNewThread(dataList, threshold, pairs, false);
resultsList = tpp.execute(); // I know I can't do this because .execute() is void but I want something like whatever the new thread returns to return to resultsList array.

Извините, если в коде есть какая-то опечатка или что-то еще, я просто сделал это сейчас, чтобы объяснить мою проблему. Я думаю, что вы можете получить идею отсюда.

1 ответ

Весь смысл SwingWorker в том, чтобы иметь возможность делать что-то асинхронно, не блокируя поток EDT. Так что вы ничего не можете вернуть из tpp.execute()потому что если бы вы могли, это означало бы, что EDT будет заблокирован, пока фоновая задача не будет завершена, и фоновая задача больше не будет фоновой задачей.

Однако вы можете передать ссылку на компонент с помощью SwingWorker и вызвать метод этого компонента из метода done():

public class SomePanel extends JPanel {

    ...
    TestNewThread tpp = new TestNewThread(this, dataList, threshold, pairs, false);
    tpp.execute();

    ...

    public void backgroundTaskHasFinishedHereIsTheResult(List<Train> trains) {
        // TODO do whatever with the list of trains computed by the background task
    }
}

И в подклассе SwingWorker:

   private SomePanel somePanel;

   public TestNewThread(SomePanel somePanel, ArrayList<Train> dataList, int threshold, int pair, boolean processFurther) {
        this.somePanel = somePanel;
        ...
   }

   @Override
    protected void done() {
        List<Train> result = get();
        somePanel.backgroundTaskHasFinishedHereIsTheResult(result);
    }
Другие вопросы по тегам