Java 如何为在不同线程中运行的变量实现变量更改侦听器(示例)
我有一个AtomicInteger变量(CurrentCycle),它将在一个单独的线程中更新到我的UI线程。我试图根据AtomicInteger的值更新UI字段中的文本字段,而不在UI线程中使用ugle while循环 我花了好几天的时间在网上搜索相关的查询,但在这方面我一无所获。我正在寻找最简单的方法来做到这一点。我知道有类似问题的帖子,但我无法使用它们,因为它们太抽象了,或者是出于不同的需要 我的主要问题是: 1.我需要注册一个监听器才能做到这一点,还是有更简单的方法? 2.在哪里以及如何注册侦听器?我是否必须设置一个单独的接口类(如果可能的话,我希望避免这种情况)。 3.你能给我举个真实的例子吗?到目前为止,抽象的解释对我没有帮助 我已经在下面包含了我的密钥代码(它没有做任何事情,因为该方法还没有被激发)。如果您能提供任何帮助,我们将不胜感激Java 如何为在不同线程中运行的变量实现变量更改侦听器(示例),java,multithreading,variables,listener,Java,Multithreading,Variables,Listener,我有一个AtomicInteger变量(CurrentCycle),它将在一个单独的线程中更新到我的UI线程。我试图根据AtomicInteger的值更新UI字段中的文本字段,而不在UI线程中使用ugle while循环 我花了好几天的时间在网上搜索相关的查询,但在这方面我一无所获。我正在寻找最简单的方法来做到这一点。我知道有类似问题的帖子,但我无法使用它们,因为它们太抽象了,或者是出于不同的需要 我的主要问题是: 1.我需要注册一个监听器才能做到这一点,还是有更简单的方法? 2.在哪里以及如何
我自己,我只给我的类一个PropertyChangeSupport字段,给它一个
addPropertyChangeListener(…)
和removePropertyChangeListener(…)
方法,只允许在setXxx(…)
方法中更改原子变量,并在同一方法中触发一个属性更改事件。我会注意在GUI的事件线程上调用fire事件。请注意,如果您的GUI是Swing GUI,那么如果您使用SwingPropertyChangeSupport,线程问题将为您解决
例如,我对一个类似问题的回答:
关于你的具体问题:
- 我需要注册一个监听器才能做到这一点,还是有更简单的方法李>
- 在哪里以及如何注册侦听器李>
addListenerXxx(…)
type方法在被观察对象上注册
- 我是否必须设置一个单独的接口类(如果可能的话,我希望避免这种情况)
- 你能给我举个真实的例子吗?到目前为止,抽象的解释对我没有帮助李>
您需要提出比这个问题更具体的问题。谢谢您回答这个问题。如果我想对变量更改触发的内容有更多的灵活性,该怎么办?例如,我希望能够在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
}