Java 多线程,计算运行线程的数量
我正在为跳棋构建一个RL ai(因此我将运行许多不同的游戏),每个线程将单独运行一个游戏。我试图限制运行线程的数量。因此,如果正在运行的线程数量小于一定数量(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++
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
s)Thread
- 如果当前正在运行的游戏数量达到最大值,请等待一个或多个游戏完成后再运行新游戏
线程应该阻塞,直到“空间”变为可用
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不需要重新创建一个有界线程池。