簡體   English   中英

多線程,計算正在運行的線程數

[英]Multiple threads, counting number of running threads

我正在為跳棋構建RL ai(因此會運行很多不同的游戲),並且每個線程將單獨運行一個游戲。 我試圖限制運行線程的數量。 因此,如果正在運行的線程數量少於某個特定數量( threadAmount ):然后創建一個新線程並運行一個新游戲,否則:不要執行任何操作並等待。

for (int i = 0; i < population.size(); i++) {
    int runningThreads = 0;
    for (int j = i; j < population.size(); j++) if (population.get(j).gameOver == false) runningThreads++; //for each running thread, add 1 to runningThreads
    if (runningThreads < threadAmount){ //threadAmount == max # of threads
      population.get(i).gameOver = false;
      Thread newThread = new Thread(population.get(i));
      newThread.start();
      println("\tnew thread started | "+runningThreads);
      delay(100);
    }
    else{
      i--; //retry this 
    }
  }

問題在於它只會創建所有線程,而println顯示“新線程已開始| 0” 25次,並且runningThreads var似乎在for循環中根本沒有增加,而是一直保持在0。來做:/,但是我知道這是處理中的,它不是線程安全的,所以即時消息准備好拉一些花哨的東西來完成它。

如果我理解正確,那么您的要求是:

  • 在單獨的Thread運行每個游戲。
  • 切勿同時運行n游戲(或Thread )。
  • 如果當前正在運行最大數量的游戲,請等到一個或多個完成后再運行新游戲。

最后一點不是很清楚。 這可能意味着游戲應該排隊等待執行, 或者可能意味着調度Thread應該阻塞,直到“空間”可用為止。

在第一種情況(排隊)中,可以通過使用配置為不超過n線程的ExecutorService輕松解決此問題。 所有線程繁忙時提交的所有任務都將排隊,直到一個線程可用為止。

ExecutorService executor = Executors.newFixedThreadPool(threadAmount);
for (Runnable r : population) {
    executor.execute(r);
}
executor.shutdown(); // If you won't be using it later

這還具有重用Thread實例而不是為每個游戲創建一個新的Thread的額外好處。

正如我在評論中所說,這是一個代碼示例,但是在c#中,我目前沒有Java代碼。 但它應該類似地工作

List<Task> lTask = new List<Task>();

Worker w = new Worker(msg);
Task t = new Task(() => w.DoWork());
            t.Start();
            lTask.Add(t);`.

我將添加的任務保留到全局列表中。 在計時器中,我會定期檢查任務(aka線程)是否已過期,

foreach(Task t in lTask)
                {
                    if (!t.Status.Equals(TaskStatus.Running))
                    {
                        // This thread is running... do whatever you do
                    }

                }

這就是我使用多線程的方式,並記錄它們的生活。

暫無
暫無

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

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