Java 如何为在不同线程中运行的变量实现变量更改侦听器(示例)

Java 如何为在不同线程中运行的变量实现变量更改侦听器(示例),java,multithreading,variables,listener,Java,Multithreading,Variables,Listener,我有一个AtomicInteger变量(CurrentCycle),它将在一个单独的线程中更新到我的UI线程。我试图根据AtomicInteger的值更新UI字段中的文本字段,而不在UI线程中使用ugle while循环 我花了好几天的时间在网上搜索相关的查询,但在这方面我一无所获。我正在寻找最简单的方法来做到这一点。我知道有类似问题的帖子,但我无法使用它们,因为它们太抽象了,或者是出于不同的需要 我的主要问题是: 1.我需要注册一个监听器才能做到这一点,还是有更简单的方法? 2.在哪里以及如何

我有一个AtomicInteger变量(CurrentCycle),它将在一个单独的线程中更新到我的UI线程。我试图根据AtomicInteger的值更新UI字段中的文本字段,而不在UI线程中使用ugle while循环

我花了好几天的时间在网上搜索相关的查询,但在这方面我一无所获。我正在寻找最简单的方法来做到这一点。我知道有类似问题的帖子,但我无法使用它们,因为它们太抽象了,或者是出于不同的需要

我的主要问题是: 1.我需要注册一个监听器才能做到这一点,还是有更简单的方法? 2.在哪里以及如何注册侦听器?我是否必须设置一个单独的接口类(如果可能的话,我希望避免这种情况)。 3.你能给我举个真实的例子吗?到目前为止,抽象的解释对我没有帮助

我已经在下面包含了我的密钥代码(它没有做任何事情,因为该方法还没有被激发)。如果您能提供任何帮助,我们将不胜感激



我自己,我只给我的类一个PropertyChangeSupport字段,给它一个
addPropertyChangeListener(…)
removePropertyChangeListener(…)
方法,只允许在
setXxx(…)
方法中更改原子变量,并在同一方法中触发一个属性更改事件。我会注意在GUI的事件线程上调用fire事件。请注意,如果您的GUI是Swing GUI,那么如果您使用SwingPropertyChangeSupport,线程问题将为您解决

例如,我对一个类似问题的回答:


关于你的具体问题:

  • 我需要注册一个监听器才能做到这一点,还是有更简单的方法
我不认为注册听众有什么困难

  • 在哪里以及如何注册侦听器
观察者将通过调用一些
addListenerXxx(…)
type方法在被观察对象上注册

  • 我是否必须设置一个单独的接口类(如果可能的话,我希望避免这种情况)
如果您使用PropertyChangeListener或Java的Observer/Observable类/接口组合,则不会

  • 你能给我举个真实的例子吗?到目前为止,抽象的解释对我没有帮助

您需要提出比这个问题更具体的问题。

谢谢您回答这个问题。如果我想对变量更改触发的内容有更多的灵活性,该怎么办?例如,我希望能够在GUI线程中调用方法?@OmahaNebrasca:如果您的不是Swing应用程序,那么只需使用PropertyChangeSupport实例,而不是SwingPropertyChangeSupport,如果您小心线程,那么这段代码应该可以工作。基本上,在可运行线程中,我有一个循环,在一个定时循环中播放不同的声音——我希望能够在播放的声音发生变化时显示一个图形,可能是一个计时器和一些文本。
// MyActivity.java
    // Declaration (do I need this?)
        AtomicInteger CurrentCycle = new AtomicInteger(0);'


// Method which doesn't appear to be firing when CurrentCycle Changes...
    public void setVariableChangeListener(VariableChangeListener variableChangeListener) {
         this.variableChangeListener = variableChangeListener;

        if ((CurrentCycle != PreviousCycle ) && (this.variableChangeListener !=null)) {
            Toast.makeText(getApplicationContext(), "Test - code on variable change is firing.", Toast.LENGTH_SHORT).show();
           PreviousCycle=CurrentCycle;
    }
public class ServerManager implements Runnable {
  public static final String IS_RUNNING = "is running"; // for the Event's name

  // if not a Swing app, then use a PropertyChangeSupport field
  private SwingPropertyChangeSupport propChngSupport = new SwingPropertyChangeSupport(this);
  private volatile boolean isRunning  = false;
  // other variables

  // addPropertyChangeListener(...) {...} goes here
  // removePropertyChangeListener(...)  {...} goes here

  public void setIsRunning(boolean isRunning) {
    boolean newValue = isRunning;
    boolean oldValue = this.isRunning;
    this.isRunning = isRunning;
    propChngSupport.firePropertyChange(IS_RUNNING, oldValue, newValue);    
  }

  public void run() {
    // ....
  }

  // other methods
}