用几个请求终止Java中的线程?

用几个请求终止Java中的线程?,java,android,Java,Android,假设我在客户端Java应用程序(即Android应用程序)中有一个方法 ExecutorService池=ExecutorsService.newFixedThreadPool(1)//池中有1个线程 public void使HttpRequestVeryVeryValentic(){ /*在后台线程中*/ CompleteableFuture s=CompleteableFuture.SupplySync(()->makeCostlyReq,pool)); s、 get(); updateTh

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

ExecutorService池=ExecutorsService.newFixedThreadPool(1)//池中有1个线程
public void使HttpRequestVeryVeryValentic(){
/*在后台线程中*/
CompleteableFuture s=CompleteableFuture.SupplySync(()->makeCostlyReq,pool));
s、 get();
updateTheUserUIInMainUIThread;//使用更新
}
onClicklistener((b)->makeHttpRequestVeryVeryValentic());//UI中的某个按钮将发出http请求
愤怒中,用户点击按钮100次,然后100个请求被提交到线程池中。发生了两件坏事:

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

(2) 每次返回后,UI都会刷新100次


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

如果您希望发送每个http请求,但没有并发性。
锁定
可能会对您有所帮助。下面是伪代码:

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
ExecutorService池=ExecutorsService.newFixedThreadPool(1)//池中有1个线程
Lock httpRequestLock=new ReentrantLock();
public void使HttpRequestVeryVeryVeryValentic()昂贵{
布尔锁定=httpRequestLock.tryLock(10,TimeUnit.SECONDS);
如果(!已锁定){
//无法获取请求锁定util超时(10秒)
返回;
}
试一试{
/*在后台线程中*/
CompleteableFuture s=CompleteableFuture.SupplySync(()->makeCostlyReq,pool));
s、 get();
updateTheUserUIInMainUIThread;//使用更新
}最后{
httpRequestLock.unlock();
}
}
onClicklistener((b)->makeHttpRequestVeryVeryValentic());//UI中的某个按钮将发出http请求
我们使用
Lock
来确保同一时间只有一个请求,并在get Lock发送请求时设置一个超时来跟踪请求


此外,如果您只想让用户以低频率发送请求,例如1次/10s。您可以声明一个变量以保留上次发送请求的时间,并每次检查上次执行时间和当前时间之间的持续时间。

如果您想发送每个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
ExecutorService池=ExecutorsService.newFixedThreadPool(1)//池中有1个线程
Lock httpRequestLock=new ReentrantLock();
public void使HttpRequestVeryVeryVeryValentic()昂贵{
布尔锁定=httpRequestLock.tryLock(10,TimeUnit.SECONDS);
如果(!已锁定){
//无法获取请求锁定util超时(10秒)
返回;
}
试一试{
/*在后台线程中*/
CompleteableFuture s=CompleteableFuture.SupplySync(()->makeCostlyReq,pool));
s、 get();
updateTheUserUIInMainUIThread;//使用更新
}最后{
httpRequestLock.unlock();
}
}
onClicklistener((b)->makeHttpRequestVeryVeryValentic());//UI中的某个按钮将发出http请求
我们使用
Lock
来确保同一时间只有一个请求,并在get Lock发送请求时设置一个超时来跟踪请求


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

问得好,但标题可能需要一些调整(不清楚)。简单的解决方案:在第一次单击后禁用该按钮,因此无法添加其他请求。或者在启动请求时设置和/或检查的易失性/原子性标志,并在完成时取消设置。问题很好,但标题可能需要一些调整(不清楚)。简单的解决方案:在第一次单击后禁用按钮,因此无法添加其他请求。或者在启动请求时设置和/或检查并在完成时取消设置的易失性/原子标志。