【发布时间】:2013-03-02 23:28:54
【问题描述】:
我有一个来自 GUI 问题的用例,我想提交给您。
用例
我有一个 GUI,它根据用户在 GUI 中设置的一些参数显示计算结果。例如,当用户移动滑块时,会触发几个事件,这些事件都会触发新的计算。当用户将滑块值从 A 调整到 B 时,会触发几十个事件。
但计算可能需要几秒钟,而滑块调整可以每 100 毫秒触发一次事件。
如何编写一个合适的线程来监听这些事件,并过滤它们以使结果的重绘更加生动?理想情况下,您会喜欢类似的东西
- 收到第一个更改事件后立即开始新的计算;
- 如果收到新事件,则取消第一次计算,并使用新参数开始新的计算;
- 但要确保最后一个事件不会丢失,因为最后完成的计算需要是具有最后更新参数的计算。
我的尝试
我的一个朋友 (A. Cardona) 提出了这种更新程序线程的低级方法,可以防止太多事件触发计算。我在这里复制粘贴(GPL):
他把它放在一个扩展 Thread 的类中:
public void doUpdate() {
if (isInterrupted())
return;
synchronized (this) {
request++;
notify();
}
}
public void quit() {
interrupt();
synchronized (this) {
notify();
}
}
public void run() {
while (!isInterrupted()) {
try {
final long r;
synchronized (this) {
r = request;
}
// Call refreshable update from this thread
if (r > 0)
refresh(); // Will trigger re-computation
synchronized (this) {
if (r == request) {
request = 0; // reset
wait();
}
// else loop through to update again
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void refresh() {
// Execute computation and paint it
...
}
每当 GUI 发送一个事件表明参数已更改时,我们都会调用 updater.doUpdate()。这导致方法refresh() 被调用的次数要少得多。
但我无法控制。
另一种方式?
我想知道是否有另一种方法可以做到这一点,那就是使用 jaca.concurrent 类。但我无法在 Executors 框架中排序我应该从哪个开始。
你们中的任何人都有类似用例的经验吗?
谢谢
【问题讨论】:
标签: java multithreading java.util.concurrent