在其他线程中更改变量的侦听器
Change listener of variable in other thread
我有一个 REST 客户端,它正在接收一个 JSON 对象。此客户端在自己的线程中工作,对象每秒更新约 10 次。
main class(创建线程)现在应该能够对指定线程对象的更改做出反应。 ChangeListener 是最有用的方法吗?我的问题是将 Listener 与线程变量结合起来。我只知道如何提供线程安全的变量获取器,但这现在没有用。有没有人举例说明如何从另一个线程观察这样的值?
处理所有值并不重要。 (json 对象包含位置数据)主要 class 之后应该使用该数据来模拟鼠标移动,但这与问题无关。
谢谢大家的帮助!
ChangeListener 是最好和最简单的方法,但不是唯一的方法。您还可以使用 wait/notifyall observer pattern.You 可以使用一些易失性标志将线程变量与侦听器分开,您可以在将新收到的 jason 字符串与当前 jason 字符串进行比较时更新该标志。我附加了一个可能有帮助的虚拟代码:
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicReference;
public class ChangeManager{
private Set<ChangeListener> listenerSet = new HashSet<ChangeListener>();
private volatile boolean stateChanged;
private Timer timer = new Timer();
private AtomicReference<MyJasonObject> currentJasonObjectState = new AtomicReference<MyJasonObject>();
public void start(){
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
monitorValue();
}
}, 0, 1000);
}
public void monitorValue(){
// Make Rest call and check if Jason object has changed and so update the stateChanged flag.
stateChanged = hasStateChange();
if(stateChanged){
Iterator<ChangeListener> i = listenerSet.iterator();
while(i.hasNext()) {
i.next().notifyListener();
}
stateChanged = false;
}
}
public void addListener(ChangeListener listener){
listenerSet.add(listener);
}
public void removeListener(ChangeListener listener){
listenerSet.remove(listener);
}
}
interface ChangeListener {
void notifyListener();
}
我有一个 REST 客户端,它正在接收一个 JSON 对象。此客户端在自己的线程中工作,对象每秒更新约 10 次。
main class(创建线程)现在应该能够对指定线程对象的更改做出反应。 ChangeListener 是最有用的方法吗?我的问题是将 Listener 与线程变量结合起来。我只知道如何提供线程安全的变量获取器,但这现在没有用。有没有人举例说明如何从另一个线程观察这样的值?
处理所有值并不重要。 (json 对象包含位置数据)主要 class 之后应该使用该数据来模拟鼠标移动,但这与问题无关。
谢谢大家的帮助!
ChangeListener 是最好和最简单的方法,但不是唯一的方法。您还可以使用 wait/notifyall observer pattern.You 可以使用一些易失性标志将线程变量与侦听器分开,您可以在将新收到的 jason 字符串与当前 jason 字符串进行比较时更新该标志。我附加了一个可能有帮助的虚拟代码:
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicReference;
public class ChangeManager{
private Set<ChangeListener> listenerSet = new HashSet<ChangeListener>();
private volatile boolean stateChanged;
private Timer timer = new Timer();
private AtomicReference<MyJasonObject> currentJasonObjectState = new AtomicReference<MyJasonObject>();
public void start(){
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
monitorValue();
}
}, 0, 1000);
}
public void monitorValue(){
// Make Rest call and check if Jason object has changed and so update the stateChanged flag.
stateChanged = hasStateChange();
if(stateChanged){
Iterator<ChangeListener> i = listenerSet.iterator();
while(i.hasNext()) {
i.next().notifyListener();
}
stateChanged = false;
}
}
public void addListener(ChangeListener listener){
listenerSet.add(listener);
}
public void removeListener(ChangeListener listener){
listenerSet.remove(listener);
}
}
interface ChangeListener {
void notifyListener();
}