gpt4 book ai didi

java - 在 Java 中通过多个请求终止线程?

转载 作者:太空宇宙 更新时间:2023-11-04 09:31:44 25 4
gpt4 key购买 nike

假设我在 CLIENT Java 应用程序(即 Android 应用程序)中有一个方法

ExecutorService pool = ExecutorsService.newFixedThreadPool(1); //1 thread in pool

public void makeHTTPRequestVeryVeryCostly() {
/* IN A BACKGROUND THREAD */
CompleteableFuture<String> s = CompleteableFuture.supplyAsync(() -> makeCostlyReq, pool));
s.get();
updateTheUserUIInTheMainUIThread(s); //Update with s
}

button.onClicklistener((b) -> makeHTTPRequestVeryVeryCostly()); // some button in the UI that will make the http request

愤怒时,用户点击按钮 100 次,然后 100 个请求已提交到线程池中。发生了 2 件坏事:

(1) 昂贵的请求计算了 100 次

(2) 每次返回后UI刷新100次。

这些都是非常大的问题。在Java中,有什么方法可以解决这个问题呢?最好在一次成功的请求后终止线程池中所有之前的请求,如何做到这一点?

最佳答案

如果你想发送每个http请求,但没有并发。Lock可能会帮助你。下面的伪代码:

ExecutorService pool = ExecutorsService.newFixedThreadPool(1); //1 thread in pool
Lock httpRequestLock = new ReentrantLock();

public void makeHTTPRequestVeryVeryCostly() {
boolean locked = httpRequestLock.tryLock(10, TimeUnit.SECONDS);
if(!locked){
//can't get the request lock util timeout(10s)
return;
}

try{
/* IN A BACKGROUND THREAD */
CompleteableFuture<String> s = CompleteableFuture.supplyAsync(() -> makeCostlyReq, pool));
s.get();
updateTheUserUIInTheMainUIThread(s); //Update with s
}finally{
httpRequestLock.unlock();
}
}

button.onClicklistener((b) -> makeHTTPRequestVeryVeryCostly()); // some button in the UI that will make the http request

我们使用Lock来确保同一时间只有一个请求,并在获得锁发送请求时为后续请求设置超时。

另外,如果你只是想让用户以较低的频率发送请求,比如1次/10s。你可以声明一个变量来保存上次发送请求的时间,并每次检查上次执行时间与当前时间之间的持续时间。

关于java - 在 Java 中通过多个请求终止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57032239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com