Java 多线程,计算运行线程的数量

Java 多线程,计算运行线程的数量,java,processing,Java,Processing,我正在为跳棋构建一个RL ai(因此我将运行许多不同的游戏),每个线程将单独运行一个游戏。我试图限制运行线程的数量。因此,如果正在运行的线程数量小于一定数量(threadAmount):那么创建一个新线程并运行一个新游戏,否则:什么都不要做,等待 for (int i = 0; i < population.size(); i++) { int runningThreads = 0; for (int j = i; j < population.size(); j++

我正在为跳棋构建一个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 
    }
  }
for(int i=0;i

问题是它只是随意创建所有线程,
println
显示“新线程已启动| 0”25次,
runningThreads
var在for循环中似乎根本没有增加,只是保持在0。不确定该怎么办:/,但我知道这是在处理,而且它不是线程安全的,所以我准备用一些奇特的Smance工具来完成它。

正如我在评论中所说的,这是一个代码示例,但它是c语言的,我目前没有java代码。但它也应该起到类似的作用

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

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

这是我处理多线程的方法,并记录它们的生命。

如果我理解正确,以下是您的要求:

  • 在单独的
    线程中运行每个游戏
  • 不允许同时运行超过
    n
    个游戏(或
    Thread
    s)
  • 如果当前正在运行的游戏数量达到最大值,请等待一个或多个游戏完成后再运行新游戏
最后一点并不完全清楚。这可能意味着游戏应该排队等待执行,也可能意味着调度
线程
应该阻塞,直到“空间”变为可用

ExecutorService executor = Executors.newFixedThreadPool(threadAmount);
for (Runnable r : population) {
    executor.execute(r);
}
executor.shutdown(); // If you won't be using it later
在第一种情况下(排队),这可以通过使用配置为不超过
n
线程的线程来轻松解决。所有线程忙时提交的任何任务都将排队,直到有一个线程可用

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

这还有一个额外的好处,即重用
线程
实例,而不是为每个游戏创建一个新的
线程。

您的代码不清楚,请使用适当的括号。如果第二个for循环没有使用括号,应该这样做。递增整数值在多线程方法中不起作用,您可以更好地声明一个全局列表,并且在启动任何线程之前,将该线程添加到此容器中。如果有任何线程退出,请将其从该线程中删除,或者您可以检查线程是否正在运行,从而获得当前的活动线程计数。我认为这将帮助您正确测量线程数。这与处理语言有关吗?如果没有,请删除“处理”标签,因为这是不合适的。这是明智的做法。OP不需要重新创建一个有界线程池。