[英]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.