多线程,计数 运行 个线程
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
。
我正在为西洋跳棋构建一个 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
。