Я новичок в JAVA и пытаюсь изучить некоторые концепции параллелизма.
У меня есть простой класс графического интерфейса, который открывает окно с одной кнопкой, которую я хочу использовать для паузы / продолжения.
Кроме того, у меня есть класс, расширяющий TimerTask, он выглядит так, как показано ниже, и начинается с графического интерфейса:

public class process extends TimerTask {
  public void run() { 
     while(true) { /*some repetitive macro commands.. */ }
  }
} 

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

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

Но потом мне пришлось набрать много while(button); из-за занятого ожидания внутри while() ...
Как вы думаете, я могу сделать что-то вроде Thread.sleep() или что-то в этом роде, но не из потока задач?

3
Tezro 24 Ноя 2019 в 03:46

1 ответ

СТАРЫЙ ОТВЕТ

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

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

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

.

НОВЫЙ ОТВЕТ

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

Перефразируя свой вопрос: вы хотите запустить неопределенную задачу, например, скажем, мы играем песню, а затем щелкнуть кнопку, чтобы приостановить песню, при повторном нажатии следует продолжить песню? Если да, я думаю, что ниже крошечная программа может сработать для вас.

    public class Test{

        static JLabel label;
        static int i = 0;
        static JButton action;
        static boolean x = false; //setting our x to false initialy

        public static void main(String[] args) { 
            JFrame f=new JFrame();//creating instance of JFrame  

            label = new JLabel("0 Sec"); //initialized with a text 
            label.setBounds(130,200,100, 40);//x axis, y axis, width, height  

            action=new JButton("Play");//initialized with a text 
            action.setBounds(130,100,100, 40);//x axis, y axis, width, height  

            f.add(action);//adding button in JFrame  
            f.add(label);


            action.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e){

                if(x){                
                    x = false; //Update x here

                    action.setText("Play");
                    action.revalidate();
                }else{
                    x = true; //Update x here also

                    action.setText("Pause");
                    action.revalidate();

                    if(x){ //Using x here to determind whether we should start our child thread or not.
                    (new Thread(new Child())).start();
                    }
                }
            }
        });

            f.setSize(500, 700);//500 width and 700 height  
            f.setLayout(null);//using no layout managers  
            f.setVisible(true);//making the frame visible  
        }
    } 

    class Child implements Runnable{

        @Override
        public void run() {
               while (x) { 

                //You can put your long task here.

                i++;        
                label.setText(i+" Secs");
                label.revalidate();

                try {
                    sleep(1000); //Sleeping time for our baby thread ..lol
                } catch (InterruptedException ex) {
                    Logger.getLogger("No Foo");
                }
            } 
        }
    }
1
Wale 27 Ноя 2019 в 03:06
Привет, это было действительно интересно, спасибо. не могли бы вы объяснить примечание, почему моя программа вылетает и, может быть, как предотвратить? Я просто хочу, чтобы некоторые макрокоманды выполнялись в цикле в течение нескольких часов, пока я не захочу, чтобы он остановился.
 – 
Tezro
25 Ноя 2019 в 17:36
Вы используете SWING для графического интерфейса?
 – 
Wale
26 Ноя 2019 в 17:27
Да, я использую intellij и качаю графический интерфейс.
 – 
Tezro
26 Ноя 2019 в 19:51
Я рекомендую вам пройти через docs.oracle.com/javase/tutorial/ uiswing / concurrency / index.html Сам Swing является однопоточным, и это может быть блокировщиком. Тем временем я обновлю ответ выше.
 – 
Wale
26 Ноя 2019 в 22:15
Я изменю ваш вопрос выше, чтобы он соответствовал основной теме.
 – 
Wale
26 Ноя 2019 в 23:18