Das kommt immer darauf an, was du machen willst. Wenn du eine hochgradig parallelisierbare Aufgabe lösen willst, und 1000 Kerne zur Verfügung hast, kannst du 1000 Threads nutzen. Wenn du eine komplexe Aufgabe zu lösen hast, die sich nicht (einfach) in mehrere Teilaufgaben zerlegen lässt, die in ihrem Speicherbereich für sich werkeln, dann nützen dir die 1000 Threads ungefähr gar nichts, da diese dann fast nur damit beschäftigt sind, ihre Lese- und Schreibzugriffe gegenseitig abzustimmen anstatt wirklich zu arbeiten. Eigentlich braucht man dann sogar länger.
Für eine normale Anwendung sollten es imho nicht mehr als ein halbes Dutzend sein. Einer für die GUI, und dann ein paar, die ggf. im Hintergrund arbeiten, z.B. Dateien scannen, Zeug aus dem Netz runterladen, Grafik-Rendering, ...
OutOfMemory-Exception kann im Zusammenhang mit Threads auch andere Ursachen haben. Ich bekomme diese Meldung regelmäßig, wenn ich mit Bitmaps in Threads arbeite - das ist nämlich böhse.
We are, we were and will not be.