Уничтожение потока в SwingUtilities.invokeLater () - PullRequest
1 голос
/ 13 мая 2011

У меня есть приложение для свинга. После нажатия на пункт меню в строке меню я пытаюсь выполнить вызов API, который предположительно займет некоторое время.

Я не хотел, чтобы приложение Swing зависало / зависало до тех пор, пока вызов API не даст своего результата, поэтому я использовал SwingUtilities.invokeLater, чтобы отделить вновь созданный поток, который позаботится о вызове API. Ниже приведен код для выше

public void actionPerformed(ActionEvent e){
    Object src=e.getSource();

    if(src.equals(theJMenuItemClicked)){
        SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        //apicall here
                    }
                })
    }

Пока работает поток вызовов API, я показываю JDIalog с сообщением «Выполняется вызов API» и кнопкой «Прервать поток».

Я бы хотел убить тему, нажав кнопку "ABort Thread" в Jdialog.

Если это обычный поток, у нас есть Thread t = new Thread(new Runnable()), и мы вызываем t.stop для того же.

Как мне получить этот конкретный экземпляр потока, порожденный SwingUtilities, чтобы я мог вызвать остановку на нем? Проще говоря, как я могу уничтожить созданный выше поток?

1 Ответ

0 голосов
/ 23 октября 2011
public class SwingUtilitiesExample implements ActionListener {

// Declaration of Swing Components
private JMenuItem menuItem;
private JButton abortOperation;

// Thread-safe indicator of the presence of the Thread
private volatile boolean isThreadRunning = false;

public SwingUtilitiesExample() {
    // Initialize Swing Components 
    menuItem = new JMenuItem();

    // Add ActionListeners
    menuItem.addActionListener(this);
    abortOperation.addActionListener(this);
}

@Override
public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();
    if (source.equals(menuItem)) {
        isThreadRunning = true;
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                while (isThreadRunning) {
                    // API calls here
                }
            }
        });
    } else if (source.equals(abortOperation)) {
        isThreadRunning = false;
    }
}
}

Изменяя значение isThreadRunning на false, вы можете эффективно прервать поток. Пока Поток регулярно проверяет этот логический код, этот код будет работать нормально.

Метод Thread.stop() устарел. Oracle заявляет, что метод по своей сути небезопасен . Поэтому вы должны воздерживаться от его использования. Попробуйте вместо этого использовать логические переменные Thread-safe для управления потоком Thread, как показано в примере кода выше.

Если вы хотите вернуть какой-то тип после того, как закончите Thread, вы можете рассмотреть класс SwingWorker.

...