Присоединение не диктует, что потоки выполняются последовательно - оно просто заставляет текущий поток ждать завершения указанного потока, прежде чем продолжить.
Таким образом, если вы запустите 300 потоков, а затем соедините их все, 300 потоков будут работать параллельно, и объединение потоков завершится после завершения 300 потоков.
const int COUNT = 300;
// create and start the threads
var threads = new Thread[COUNT];
for (int index = 0; index < COUNT; index += 1)
{
threads[index] = new Thread(...);
threads[index].Start();
}
// now they're running, join them all
for (int index = 0; index < COUNT; index += 1)
{
threads[index].Join();
}
// we're done
Важной частью является то, что вы запускаете их все до начала объединения, в противном случае вы будете ждать окончания каждого потока, прежде чем начинать следующий, поэтому тогда они действительно будут последовательными. Я думаю, это то, что вы можете делать?