首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改其他线程中变量的侦听器

更改其他线程中变量的侦听器
EN

Stack Overflow用户
提问于 2015-02-16 03:12:51
回答 1查看 1.1K关注 0票数 1

我有一个REST客户机,它接收一个JSON对象。此客户端在自己的线程中工作,对象每秒钟更新约10次。

主类(创建线程)现在应该能够对指定线程对象的更改做出反应。ChangeListener是最有用的方法吗?我的问题是将侦听器与线程变量组合在一起。我只知道如何提供线程安全的变量获取器,但这现在没有帮助。有没有人举过如何从另一个线程中观察这样的值的例子?

处理所有的价值观并不是很重要。(json对象包含位置数据)之后,主类应该使用这些数据来模拟鼠标移动,但这与这个问题并不真正相关。

谢谢你们的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-16 10:29:26

ChangeListener是最好和最简单的方法,但不是唯一的方法。您还可以使用等待/通知所有观察者,pattern.You可以使用一些易失性标志将线程变量从侦听器中分离出来,当您比较新接收到的jason和当前jason时,可以更新该标志。我附加了一个虚拟代码,它可能会有帮助:

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28534023

复制
相关文章

相似问题

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