多线程,计数 运行 个线程

Multiple threads, counting number of running threads

我正在为西洋跳棋构建一个 RL ai(所以我会 运行 玩很多不同的游戏),每个线程都会单独 运行 一个游戏。我正在尝试限制 运行ning 线程的数量。所以如果运行ning线程的数量小于一定数量(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 显示 "new thread started | 0" 25 次并且 runningThreads var 似乎没有在 for 循环中增加根本没有,只是保持在 0。不确定要做什么:/,但我知道这是处理,它不是线程安全的,所以我准备好使用一些花哨的东西来完成它。

正如我在评论中所说,这是一个代码示例,但它是在 c# 中,我目前没有 java 代码。但它应该类似地工作

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

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

我将添加的任务保存到全局列表中。并且在计时器中,我定期检查任务(又名线程)是否过期,

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

                }

这就是我使用多线程并记录其生活的方式。

如果我没理解错的话,这些是你的要求:

  • 运行 每场比赛单独 Thread.
  • 不允许超过 n 场比赛(或 Thread 场)同时 运行。
  • 如果当前游戏的最大数量是运行ning,等到一个或多个完成然后运行新游戏。

最后一个要点并不完全清楚。这可能意味着游戏应该排队等待执行 这可能意味着调度 Thread 应该阻塞直到 "space" 可用。

在第一种情况(排队)中,可以使用配置为不超过 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