2013-03-08 47 views
1

我有一个很大的疑问,在其设计模式采取以获取以下信息:设计模式:多摆动接口监听线程变量

我也不能是静态的A类具有正在运行的线程,其更新一变量a1;

多挥杆类(B,C,D)必须用变量A.a1的当前值更新JLabel b1,c1,d1。因为A不能是静态的B,所以C,D不能做类似b1.setText(A.getInstance()。getA1())的东西;

每次创建A的新实例都没有意义,因为A具有特定的作用,并且无法每次创建。

因为A有一个更新a1变量的线程,所以还有一个同步问题,我想A,B,C,D之间共享这个变量用于读写。

我想到了Observer模式,但它仍然要求每个B,C,D向A注册,并且它不能解决同步问题。

回答

1

如果你想解除A,B,C和D的存在,那么你需要创建一个Proxy对象,它将充当中间人。该对象将知道如何到达A的实例,并在不可用时进行临时响应。

为了使同步不成问题,我建议使用消息队列来保存a1值的连续更改。代理将轮询该队列并相应地更新挥杆类。实际上,代理可以为此实现Observer模式。在A上工作的线程必须将更新发布到消息队列中。通过将其转变为一对一生产者消费者设置,您可以通过使用适当的排队(如ConcurrentLinkedQueue)来最小化延迟。

Proxy甚至不必为队列中每个值的swing组件上的更新运行更新,而只是在最新(抛弃所有中间组件)。

更新:SwingWorker类似乎是一个很好的候选人。

+1

+1''SwingWorker''可能适用于这种情况,因为'process()'在EDT上运行并且在'publish()'顺序中看到'List '。 – trashgod 2013-03-08 15:52:16