设置标志时,循环线程不退出

时间:2018-02-14 20:06:22

标签: multithreading

我试图通过设置标志退出Java(JNA)中的消息循环,但它无法正常工作。

这是我的代码:

public class MyClass() {

  private class MyInnerClass() implements Runnable {

    @Override
    public void run() {

      MSG msg = new MSG();
      while(!quit && user32.GetMessage(msg, null, 0, 0) > 0) {

        user32.TranslateMessage(msg);
        user32.DispatchMessage(msg);
      }

      System.out.println("Exited message loop!");
    }

  } // MyInnerClass


  private volatile boolean quit;
  private final User32 user32;

  public MyClass() {

    quit = false;
    user32 = User32.INSTANCE;

    Thread myThread = new Thread(new MyInnerClass());
    myThread.start();
  }

  public void quit() {

    System.out.println("Entered quit()!");
    quit = true;
  }

} // MyClass

方法quit()在回调中调用,该回调发生在代码中的其他位置。

屏幕上显示消息Entered quit()!,但消息Exited message loop!没有,并且线程一直在运行。

为什么在将quit设置为true时,消息循环不会停止?

3 个答案:

答案 0 :(得分:0)

很可能你必须混淆一些类实例或调用函数BinaryTree作为类的静态成员,或者在另一个未作为线程运行的对象上调用函数。你还需要检查对变量UPDATE Table1 SET Action = 'Insert' FROM Table1 JOIN Table2 ON Table1.id = Table2.id WHERE Table1.UID <> Table2.UID 的访问权限。我不是那么使用java的故障,但是它是否必须在一个类中设置并从另一个类读取?

java中有可能捕获变量吗?您必须创建quit(),并且需要设置该变量quit,该变量是new MyInnerClass()但不是quit

您创建MyInnerClass的实例,现在可以从MyClass向外飞行。当具有可变MyInnerClass的{​​{1}}对象从内存中释放并销毁时,MyClass的实例如何访问MyInnerClass的变量quit

答案 1 :(得分:0)

您无法访问内部类中外部类的变量。如果这样做,Java会将外部类变量的副本传递给内部类。这就是您没有收到编译器错误并且值不会更改的原因。

我找到了这个信息:

https://www.quickprogrammingtips.com/java/accessing-outer-class-local-variables-from-inner-class-methods.html

将变量声明为静态并通过外部类的名称访问它可能会有所帮助。

答案 2 :(得分:0)

问题是GetMessage永远不会返回,因此循环条件while (!quit && GetMessage() > 0)从未在第一次之后进行测试。

为了解决这个问题,我在JNA&#39; GitHub上提供的example之后重构了代码。

更具体地说,我将while (!quit)移至while (GetMessage() > 0)的单独帖子,并在System.exit(0)退出时调用while (!quit)