按钮卡住了,需要在java中打破无限循环

时间:2013-08-14 18:01:43

标签: java multithreading infinite-loop runnable

我正在编写一个程序,可以在给定的时间内将鼠标移动一定距离。所以我需要算法:

点击开始

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
    }

}

1 个答案:

答案 0 :(得分:1)

Mover类中为布尔值创建一个setter:

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后,您的主线程应该继续正常执行。