Остановить работу программы Java нажатием кнопки Stop

Коллеги, вот таким образом я ищу нужные мне новости.

public class News_from_RSS {
static String text = "";
static String smi;
static int i = 0;
static int j = 0;
public static AtomicBoolean isStop = new AtomicBoolean(false);

public static void main(String[] args) throws IOException {
    new Window();
    new Thread(() -> readRSS()).start();
}

    public static void readRSS() {
        try {
            for (i = 0; i < sources.length; i++) {
                    RSSFeedParser parser = new RSSFeedParser(sources[i]);
                    if (isStop.get()) return;
                    Feed feed = parser.readFeed();
                    for (FeedMessage message : feed.getMessages()) {
                        j++;
                        if (message.toString().indexOf(Window.find_word) >= 1) {
                            concatText(message.toString());
                            Window.appendText(message.toString());
                        }
                        if (isStop.get()) return;
                    }
                }
            //Вывод результат в консоль:
            //System.out.println(text);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Однако их так много, что иногда хочется остановить его выполнение кнопкой Stop

  //Stop button
    JButton stopBtn = new JButton("Stop");
    stopBtn.setBackground(new Color(102, 205, 170));
    stopBtn.setBounds(451, 10, 90, 23);
    getContentPane().add(stopBtn);
        // слушатель
    ActionListener aLi_stop = new StopActionListener();
    stopBtn.addActionListener(aLi_stop);

которую я создал, но не знаю что в ней указать:

public static class StopActionListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        News_from_RSS.isStop.set(true);           
    }
}

Или же в main надо создать поток или что? Подскажите..


Ответы (2 шт):

Автор решения: Olmicron

Ну для примера можно сделать так (это лишь пример!):

public class News_from_RSS {

    public static AtomicBoolean isStop = new AtomicBoolean(false)

    public static void main(String[] args) {
        new Window();
        new Thread(() -> readRSS()).start();
    }

    public static void readRSS() {
        try {
            for (i = 0; i < sources.length; i++) {
                RSSFeedParser parser = new RSSFeedParser(sources[i]);
                if ( isStop.get() ) return;
                Feed feed = parser.readFeed();
                for (FeedMessage message : feed.getMessages()) {
                    if (message.toString().indexOf(Window.find_word) >= 1) {
                        Window.appendText(message.toString()); 
                    }
                    if ( isStop.get() ) return;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static class StopActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            News_from_RSS.isStop.set(true);
        }
    }
}
→ Ссылка
Автор решения: Alexander Chernin
interface MessageListener {
    public void message(String value);
}

class RSSReaderThread extends Thread {
    private AtomicBoolean _doStop = new AtomicBoolean(false);
    private MessageListener listener = null;

    public void doStop() {
        _doStop.set(true);
    }

    public void run() {
        try {
           // ...
           for (FeedMessage message : feed.getMessages()) {
               if(_doStop.get())
                   break; // Выскакиваем из потока

               if (message.toString().indexOf(Window.find_word) >= 1) {                                  
                   if( _listener != null )
                       _listener.message(message.toString());
                   }
               }
        // ...
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Window extends <что-то там графическое-оконное>{
    private Button stopButton = ...
    private RSSReaderThread _thread

    public static void main(String[] args) {
        _thread = new RSSReaderThread();
        _thread.setMessageListener(new MessageListener() {
            public void message(String value) {
                this.appendText();
            }
        });
        _thread.start();
    }

    public static class StopActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            this._thread.doStop();
        }
    }
}
→ Ссылка