Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多次调用同一方法时取消方法调用_Java_Design Patterns_Debouncing - Fatal编程技术网

Java 多次调用同一方法时取消方法调用

Java 多次调用同一方法时取消方法调用,java,design-patterns,debouncing,Java,Design Patterns,Debouncing,我想我在这里描述的东西可能有个名字,但我不知道。所以我的第一个问题是知道这种技术的名称 下面是一个示例:假设您正在网页上实现实时搜索。每次用户在搜索框中键入内容时,您都会启动一个新的搜索查询,并且结果会尽可能经常地更新。 这是一件愚蠢的事情,因为您将发送比实际需要多得多的查询。每2-3封信发送一次请求或最多每100毫秒发送一次请求可能就足够了 因此,一种技术是安排查询在键入密钥后立即执行,如果仍有计划但未执行的查询,请取消它们,因为它们现在已过时 更具体地说,在Java中是否有解决这个问题的特

我想我在这里描述的东西可能有个名字,但我不知道。所以我的第一个问题是知道这种技术的名称

下面是一个示例:假设您正在网页上实现实时搜索。每次用户在搜索框中键入内容时,您都会启动一个新的搜索查询,并且结果会尽可能经常地更新。 这是一件愚蠢的事情,因为您将发送比实际需要多得多的查询。每2-3封信发送一次请求或最多每100毫秒发送一次请求可能就足够了

因此,一种技术是安排查询在键入密钥后立即执行,如果仍有计划但未执行的查询,请取消它们,因为它们现在已过时


更具体地说,在Java中是否有解决这个问题的特定模式或库

我必须在Swing应用程序中解决这个问题,我使用了ExecutorService,它返回我可以取消的ScheduledFuture。问题是,我必须为我想要“缓冲”的每个方法调用手动创建一个Runnable,并跟踪每个未来以取消它

我肯定我不是第一个实现这种东西的人,所以一定有一个可重用的解决方案?可能是Spring中带有注释和代理的东西?

您需要的东西被称为。您应该检查(顺便说一句,除了使用相同的名称空间之外,它完全独立于jQuery)。您需要的内容包含在以下内容中:

使用jquerythrottle/debounce,可以将延迟和函数传递给
$.debounce
获取一个新函数,该函数在重复调用时, 每个“bunch”调用只执行一次原始函数, 有效地将多个连续调用合并到单个 在开始或结束时执行

具有相同的方法:

_.debounce(function, wait, [immediate]) 
创建并返回传递函数的新取消公告版本 将其执行推迟到
等待
毫秒之后 自上次调用以来已过。有助于实施 仅应在输入停止到达后发生的行为。 例如:呈现标记注释的预览,重新计算 窗口停止调整大小后的布局,依此类推

[编辑]


我错误地读了“Javascript”而不是Java。实际的Java解决方案是在之后完成的。

如果不像executor和futures那样使用一些额外的基础设施,这在Java中是无法解决的。在Java中,不可能以语法简洁的方式解决这个问题

您总是需要某种方法结果包装器,因为该机制会立即返回,但实际结果会在稍后检索。在您的情况下,这是通过Future实现的

您将始终需要能够以允许延迟执行的方式指定要执行的代码。在大多数语言中,这是使用函数指针、函数值或闭包实现的。在Java中,由于缺少这些语言特性,这通常是通过传递一个对象来实现的,该对象实现了某种类型的接口,例如可运行的、可调用的,它允许延迟执行代码块。还有其他选择,但没有一个是简单的,例如使用动态代理

tl;博士


在Java中无法以简洁的方式实现这一点。

给出了其他答案,经过一些搜索,似乎确实没有库可以实现我想要的功能

我创建了一个并将其放在GitHub上。这个问题的未来读者可能会发现它很有趣

我认为它还不是很好,但至少它可以工作,并且可以声明性地使用:

@Debounce(delayMilliseconds = 100)
public void debouncedMethod(int callID, DebounceTest callback) { }

我认为你没有任何模式。流程很简单:您第一次运行异步任务,只需设置flag=“BUSY”,这意味着:在第一次请求没有得到响应之前,不要启动下一个serch。它被称为*requestthrottling@JarrodRoberson:谢谢,这帮我找到了一些资源。但节流似乎与我描述的略有不同。通过限制,您可以立即分派请求,如果请求太多,则阻止较新的请求(较早的请求具有优先级)。我描述的方法延迟初始请求,以便在新的请求到达时可以取消它们(稍后的请求具有优先级);阻塞、取消、延迟等等。它的概念是明确地管理请求/事务的速率,而不仅仅是让它成为消防水管。另请参见Nagle的算法,了解它在TCP中的实现方式,以解决30年前telnet的一个非常类似的问题:谢谢。去Bouncing是我一直在寻找的术语。除非有人能给我一些更具体的java语言,否则我会接受你的答案。@ARRG:哦,糟了,我还以为是Javascript(因此这些例子)。:)是的,谢谢。我所寻找的是在维护良好的库中(如js或jQuery,但在java世界中)对此的支持。但我想这是javascript比Java更需要的东西。@ARRG:我经常在C#中使用它,就像在控件之间焦点转移时刷新相关菜单和工具栏(例如复制/粘贴)一样。但是没有Java实现。看起来Java 8对lambda函数有一些支持。也许,我还没有看过Java 8,因为很多企业产品还不支持它。+1你应该接受这个答案,它解决了问题,目前是唯一在线可用的Java解决方案(或极少数解决方案之一)。
@Debounce(delayMilliseconds = 100)
public void debouncedMethod(int callID, DebounceTest callback) { }