应用背景:现在要编一个通信客户端程序,其中在一个线程里进行网络输入流的监听,在收到我需要的消息后,我会对某个类中的一个全局变量进行置位;这个变量的值改变后,在另一个线程中要有响应。类似于给按钮绑定个监听器的效果。更具体的讲是这要的:比如客户端登陆的时候,收到登陆成功的消息话flag = 0, 收到登陆失败消息的话flag = -1。但登陆线程和监听线程是两个线程(考虑到扩展性,我想让监听线程与其它线程独立开来),我如何能让监听线程中收到消息,对全局变量进行置位,让登陆线程立刻就知道变量已经置位。我不知道在这种场合下怎样设计比较合适,求指教!代码和思路均可!

解决方案 »

  1.   

    很明显的多个线程,访问相同的数据,可以考虑两种模式:1.将flag当成监听线程的检查点,定时检查flag的状态(数值),并作出相应的动作,注意线程安全问题。当然,为了增强响应的及时性,可以进一步优化代码,将定时检测改为wait/notify方式。2.在登录线程和监听线程之间,生成一个事件对象,比如登录事件的事件对象,flag可以放置在事件对象中。在两个线程之间设置一个线程安全的事件队列(可以是阻塞队列),当登录线程登录动作之后,手动生成一个登录事件的事件对象,将其放入队列中,监听线程不停地从队列中取得事件对象进行相应的处理。本人推荐使用事件模型进行开发,便于对程序的理解和维护。
      

  2.   

    可以考虑用wait/notify机制。比如设置变量:Object flag = new Object();监听线程就是:flag.wait();负责通知的线程就是调用:flag.notify();
    不过要注意配对关系。
      

  3.   

    楼上 +1也可以用 java.util.concurrent.CountDownLatch
      

  4.   


    +1 楼主可以看看Observer模式 
      

  5.   

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

  6.   

    wait/notify应该是最基本的方法了,我觉得适合,只是线程之间关系如果复杂的话,可能就晕了;观察者模式我觉得挺好的,只要写个类实现Observer接口,写update函数就好了,感觉使用挺灵活的。不过虽然在update函数里得知消息了,但还是需要把这个消息告诉给登陆线程,这可能还要用到wait和notify。事件模型应该是实现相当于给按钮绑定监听器那种。实现可能比观察者模式稍微复杂点。谢谢各位的帮助,又学了很多。