簡體   English   中英

在Java中將新任務添加到線程池之前,等待任務完成的最佳方法?

[英]Best way to wait on tasks to complete before adding new ones to threadpool in Java?

我想使用諸如ThreadPoolExecutor之類的東西來管理在可用線程上運行一堆任務。 這些任務屬於同一類型,但處理不同的帳戶。 可以定期添加這些帳戶的新任務,我希望它檢查並不允許新任務開始,直到同一帳戶的舊任務已經完成為止。 最好的方法是什么?

  1. 帳戶“ 234”的任務已啟動(通過ThreadPoolExecutor.execute())

  2. 帳戶“ 238”的任務已啟動(通過ThreadPoolExecutor.execute())

  3. 為帳戶“ 234”創建了新任務,但未添加執行,因為第一個“ 234”任務未完成(檢查此問題的最佳方法?)

  4. 帳戶“ 238”的任務完成

  5. 帳戶“ 238”的新任務啟動(通過ThreadPoolExecutor.execute()),因為該帳戶當前沒有運行

最好的方法是什么? 只需在Runnable中使用wait / sleep()檢查某些檢查變量,以完成“ 234”的第一個任務? 還是有更好的解決方案?

毫無疑問,我有一些對API的這一部分有更多經驗的人會有更好的主意,但這是我對這個主題的看法...

基本上,我將從“正在運行”和“正在等待”隊列開始。 “正在運行”隊列跟蹤當前正在運行的內容,“正在等待”隊列跟蹤您保留的任務。 這些隊列將需要鍵入某種“組標識符”以使其更容易查找(例如Map<String, List<Runnable> ),例如您的帳號

我將看一下重寫execute方法。 在這里,我將傳入的任務與正在運行的隊列進行比較,以確定當前是否正在運行任何相關任務。 如果有,我將把新任務放到等待隊列中。

然后,我將重寫beforeExecute方法。 在這里,我會將任務注冊在“正在運行”隊列中。

我會覆蓋“ afterExecute”方法。 在這里,我將從“正在運行”的隊列中刪除已完成的任務,查找等待任務的隊列(通過已完成任務的組標識符),然后通過execute方法將隊列中的第一個任務添加到execute

或者你可以按照路易斯的建議:P

一種簡單的可能性。 也許過於簡單。 創建10個SingleThreadedExecutors。 對於每個任務

  1. 通過使用accountID mod 10來“哈希” accountID以找到適當的SingleThreadedExecutor。 (在實踐中,accountID可能不是int,例如,如果它是String,則將其設為hashCode()mod 10)。
  2. 將任務提交到該SingleThreadedExecutor。

這可能不理想,因為帳戶238的處理將被迫等待直到358完成,但是至少您可以確保特定帳戶(例如234)永遠不會同時運行。 取決於您可以允許多少延遲。 顯然,您可以使用執行程序的數量以及我描述的簡單化的“哈希”算法。

我遇到了同樣的問題。 我的解決方案是使用HashSet。

private static HashSet<Integer> runningTasks = new HashSet();

public void run(){
  boolean isAlreadyRunning = false;
  synchronized (runningTasks) {
    if (runningTasks.contains(this.accountId)) {
      isAlreadyRunning = true;
    } else {
      runningTasks.add(this.accountId);
    }
  }
  if(isAlreadyRunning){
    //schedule this task to run later here
    //what I did was to reinsert this task to the task queue 5 seconds later
    return;
  }
  //do your stuffs here

  synchronized (runningTasks) {
    runningTasks.remove(this.accountId);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM