日期:2014-05-20  浏览次数:20704 次

java中如何在对一个变量进行监听
应用背景:现在要编一个通信客户端程序,其中在一个线程里进行网络输入流的监听,在收到我需要的消息后,我会对某个类中的一个全局变量进行置位;这个变量的值改变后,在另一个线程中要有响应。类似于给按钮绑定个监听器的效果。

更具体的讲是这要的:比如客户端登陆的时候,收到登陆成功的消息话flag = 0, 收到登陆失败消息的话flag = -1。但登陆线程和监听线程是两个线程(考虑到扩展性,我想让监听线程与其它线程独立开来),我如何能让监听线程中收到消息,对全局变量进行置位,让登陆线程立刻就知道变量已经置位。

我不知道在这种场合下怎样设计比较合适,求指教!代码和思路均可!

------解决方案--------------------
很明显的多个线程,访问相同的数据,可以考虑两种模式:

1.将flag当成监听线程的检查点,定时检查flag的状态(数值),并作出相应的动作,注意线程安全问题。当然,为了增强响应的及时性,可以进一步优化代码,将定时检测改为wait/notify方式。

2.在登录线程和监听线程之间,生成一个事件对象,比如登录事件的事件对象,flag可以放置在事件对象中。在两个线程之间设置一个线程安全的事件队列(可以是阻塞队列),当登录线程登录动作之后,手动生成一个登录事件的事件对象,将其放入队列中,监听线程不停地从队列中取得事件对象进行相应的处理。

本人推荐使用事件模型进行开发,便于对程序的理解和维护。
------解决方案--------------------
可以考虑用wait/notify机制。

比如设置变量:Object flag = new Object();

监听线程就是:flag.wait();

负责通知的线程就是调用:flag.notify();


不过要注意配对关系。
------解决方案--------------------
楼上 +1

也可以用 java.util.concurrent.CountDownLatch
------解决方案--------------------
探讨

可以考虑用wait/notify机制。

比如设置变量:Object flag = new Object();

监听线程就是:flag.wait();

负责通知的线程就是调用:flag.notify();


不过要注意配对关系。

------解决方案--------------------
观察者模式
给这个变量封装一个setter方法,保证只有该方法可以修改变量的值,然后在这个方法中通知所有观察此变量的对象