this question have more implication that you think. first Tparallel is designed to work only on specifical case. for exemple
this is good to do with tparallel
TParallel.For(1, Max, procedure (I: Integer)
begin
Do_processor_intensive_work
end);
this must be avoiding :
TParallel.For(1, Max, procedure (I: Integer)
begin
do_waiting_proc_like_downloading_url
end);
why? and this is where i answer to your question : it's because Tparallel create the number of thread that match the number of processor (virtual or physical) available on the system. so if you have 32 processors then it's will create max 32 threads, if you have only 1 processor then it's will create only one thread. this is also global to all the app, if you have 2 thread that each do Tparalell, you will not have more than one thread by processor
so the idea behing Tparallel is that you don't need to worry about the number of thread, the system choose the most optimal number for you. but as you see in my sample, if your tparallel is not processor intensive, then you will probably need more thread than the number of available processor and in that case i strongly sugest to avoid tparallel and use instead TanonymousThread
you can override this number by doing SetMaxWorkerThreads (that by default is the number of processor) but if you need to do this their is great luck that you must avoid at all to use Tparallel and need to use instead TanonymousThread