首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置标志时线程中的循环未退出

设置标志时线程中的循环未退出
EN

Stack Overflow用户
提问于 2018-02-15 04:06:22
回答 3查看 40关注 0票数 0

我试图通过设置一个标志来退出Java (JNA)中的消息循环,但它不起作用。

下面是我的代码:

代码语言:javascript
运行
复制
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时,为什么消息循环没有停止

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-20 02:28:20

问题是GetMessage永远不会返回,所以循环条件while (!quit && GetMessage() > 0)在第一次之后永远不会被测试。

为了解决这个问题,我按照JNA的GitHub上提供的example重构了代码。

更具体地说,我将while (!quit)移到了一个独立于while (GetMessage() > 0)的线程中,在while (!quit)退出时调用System.exit(0)

票数 0
EN

Stack Overflow用户

发布于 2018-02-15 04:10:01

很可能你不得不混淆一些类实例,或者调用函数quit()作为类的静态成员,或者调用另一个没有作为线程运行的对象上的函数。你还需要检查对变量quit的访问,我对java不是很熟悉,但是你必须在一个类中设置并从另一个类中读取的变量是相同的吗?

在java中可以捕获变量吗?您必须创建new MyInnerClass(),并且需要设置变量quit,它是MyInnerClass的成员,但不是MyClass的成员。

您创建了MyInnerClass的实例,它现在可以自由地从MyClass飞出。当带有可变quitMyClass的对象从内存中释放并被销毁时,MyClass的实例如何访问MyClass的变量quit

票数 0
EN

Stack Overflow用户

发布于 2018-02-15 04:24:44

不能在内部类中访问外部类的变量。如果这样做,Java会将外部类变量的副本传递给内部类。这就是为什么你没有得到一个编译器错误和值不会改变的原因。

我找到了这个信息:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48795355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档