Кнопка застряла, нужно разорвать бесконечный цикл в java

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

Нажмите «Пуск»

while(true){
    move mouse to point x
    sleep for n seconds
}

Что работает, но при запуске в виде потока кнопка запуска все еще нажата, потому что поток работает непрерывно. Поэтому я не могу даже выйти из этой программы (как и в случае с любым бесконечным циклом), и я не могу установить для логического значения значение «false», чтобы остановить цикл while. Что мне нужно сделать, чтобы этот поток мог работать в фоновом режиме и по-прежнему давал мне доступ, чтобы щелкнуть кнопку остановки и остановить движение мыши?

В моем основном классе у меня есть:

public void actionPerformed(ActionEvent e) {

            if (e.getSource() == btnStart) {
                Thread t = new Thread(new Mover(1000, true));
                t.run();
            }
        }

Класс потока:

import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Robot;

public class Mover implements Runnable {

    int time;
    boolean startStop;

    public Mover(int x, boolean b) {

        time = x;
        startStop = b;

    }

    @Override
    public void run() {

        while (startStop) {
            // TODO Auto-generated method stub

            //Get x position
            int intX = MouseInfo.getPointerInfo().getLocation().x;
            // String intx = Integer.toString(intX);

            //Get y position
            int intY = MouseInfo.getPointerInfo().getLocation().y;

            Robot robot;
            try {
                robot = new Robot();
                robot.mouseMove(intX - 100, intY);
            } catch (AWTException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            try {
                Thread.sleep(time);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }// Close while loop
    }

}

person Ducksauce88    schedule 14.08.2013    source источник
comment
Вы всегда должны использовать метод equals(Object) для сравнения объектов, потому что использование == может привести к неожиданным результатам.   -  person Josh M    schedule 14.08.2013
comment
Используйте start() для запуска темы, а не run().   -  person qqilihq    schedule 14.08.2013


Ответы (1)


Создайте сеттер для логического значения в классе Mover:

public void setStartStop(boolean value) {
    startStop = value;
}

Затем сохраните ссылку на Mover в своем основном классе.

Mover mover = new Mover(1000, true);
Thread thread = new Thread(mover);
thread.start();
//do stuff
mover.setStartStop(false);

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

person asteri    schedule 14.08.2013
comment
Большое спасибо. Я пытаюсь изучить темы .... и предотвратить блокировку моей рабочей машины ;-) - person Ducksauce88; 14.08.2013