如何在保持事件 运行ning 的同时 运行 循环?

How do I run loops while keeping events running?

我对将事件用于 运行 循环有疑问,因为这样做似乎会锁定线程。例如,我有一个 nativeMousePressed 和 nativeMouseReleased 事件,我试图在按下鼠标时连续执行一些代码,然后在释放鼠标时停止。我试图通过在另一个管理器 class 中创建一个静态布尔变量,然后在按下鼠标时将其设置为 true 并在释放鼠标时将其设置为 false 来做到这一点。然后我决定制作一个 while 循环,该循环从使用我之前谈到的布尔值的 nativeMousePressed 事件内部调用。问题在于,当 while 循环为 运行ning 时,无法调用任何事件,这意味着布尔值永远不会变为 false,从而创建无限循环。我怎样才能 运行 while 循环同时保持事件 运行ning 呢?

我认为这与线程被锁定有关,但我还没有处理过这样的事情,希望得到一些帮助来弄清楚如何运行 并行处理这两个事情。

public class NativeMouseEvent implements NativeMouseListener {
Program program = new Program();

@Override
public void nativeMouseClicked(org.jnativehook.mouse.NativeMouseEvent e) {
}

@Override
public void nativeMousePressed(org.jnativehook.mouse.NativeMouseEvent e) {

    if(e.getButton() == 1 && Controller.threeClicked) {
        Controller.fixAim = true;
        program.start();
    }
}

@Override
public void nativeMouseReleased(org.jnativehook.mouse.NativeMouseEvent e) {
    program.interrupt();
    Controller.fixAim = false;
}
}

这是我的第二个主题 运行ning...

public class Program extends Thread {

public void run() {
    while(Controller.fixAim) {
        System.out.println("test");
    }
}

这是我的第二次尝试,它也给了我一个错误,说 this.program 是空的。

public class NativeMouseEvent implements NativeMouseListener {
Program program;

@Override
public void nativeMouseClicked(org.jnativehook.mouse.NativeMouseEvent e) {
}

@Override
public void nativeMousePressed(org.jnativehook.mouse.NativeMouseEvent e) {

    if(e.getButton() == 1 && Controller.threeClicked) {
        Controller.fixAim = true;
        if(program != null) {
            program = new Program();
            program.start();
        }

    }
}

@Override
public void nativeMouseReleased(org.jnativehook.mouse.NativeMouseEvent e) {
    program.interrupt();
    program = null;
    Controller.fixAim = false;
}
}

鼠标按下开始踩踏,鼠标抬起停止踩踏。在跟帖中画圆
类似于下面的 java 代码。注意:这只是一个例子。您需要进行更改才能使其在您的 android 环境中运行。

public class Test { 
    Thread drawTask;
    
    public void mouseDown() {
        drawTask = new Thread(()-> {
            int i = 0;
            try {
                for(;;) {
                    System.out.print("\rDrawing circle " + i++);
                    Thread.sleep(500);
                }
            } catch(InterruptedException e) {
                System.out.println("finished drawing circle.");
            }
        });
        
        drawTask.start();
    }
    
    public void mouseUp() {
        if(drawTask != null) {
            drawTask.interrupt();
            drawTask = null;  //<--- make sure you do this
        }
    }
    
    public static void main(String[] args) {
        Test test = new Test();
        
        Scanner in = new Scanner(System.in);
        System.out.println("type anything and press Enter to simulate mouse down/up");
        in.next();
        
        test.mouseDown();
        
        in.next();
        test.mouseUp();
        
        in.next();
        in.close();
    }

}