Остановить текущий процесс (Thread) в Java по нажатию кнопки - PullRequest
2 голосов
/ 12 марта 2012

У меня есть следующие две кнопки:

 jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {

            Thread t = new Thread() {
                public void run() {
                    StreamingExperiment.streamingExperimentMain();
                }
            };
            t.setName("runThread");
            t.start();

        }
    });

и

 jButton3.setText("Cancel");
    jButton3.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {

        }
    });

JButton3 - фактически кнопка отмены, которая должна отменить текущий StreamingExperiment. Как я должен остановить текущий поток в этой ситуации?

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Вы не можете просто остановить любую тему *.Вы можете попытаться прервать это:

t.interrupt();

Но поток должен быть в состоянии справиться с этим.Возникает вопрос: что на самом деле делает

StreamingExperiment.streamingExperimentMain();

?Если он выполняет операции с интенсивным использованием ЦП, поток должен периодически проверять флаг isInterrupted() и завершать работу, если он установлен.Если он ожидает ввода / вывода или спит, скорее всего, он будет просто работать - см. InterruptedException.

Ну, технически вы может , но этот метод не рекомендуется по причине.

0 голосов
/ 12 марта 2012

У вас будет вызов ActionBistener JButton:

jButton3.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        StreamingExperiment.stop();
    }
});

Вам, конечно, нужно предоставить StreamingExperiment этот метод, содержимое которого будет зависеть от того, что делает StreamingExperiment. Если он имеет цикл, то, возможно, stop() может изменить логическое значение, которое вы используете для выхода из цикла.

Кстати, похоже, что StreamingExperiment имеет статический метод, и вы можете захотеть это исправить (если только он не представляет переменную, а не класс, и в этом случае его имя должно начинаться со строчной буквы).

...