title: Why is my multithreaded Java program not maxing out all my cores on my machine?
body: <p>I have a program that starts up and creates an in-memory data model and then creates a (command-line-specified) number of threads to run several string checking algorithms against an input set and that data model.  The work is divided amongst the threads along the input set of strings, and then each thread iterates the same in-memory data model instance (which is never updated again, so there are no synchronization issues).</p>
  
  <p>I'm running this on a Windows 2003 64-bit server with 2 quadcore processors, and from looking at Windows task Manager they aren't being maxed-out, (nor are they looking like they are being particularly taxed) when I run with 10 threads.  Is this normal behaviour?</p>
  
  <p>It appears that 7 threads all complete a similar amount of work in a similar amount of time, so would you recommend running with 7 threads instead?</p>
  
  <p>Should I run it with more threads?...Although I assume this could be detrimental as the JVM will do more context switching between the threads.  </p>
  
  <p>Alternatively, should I run it with fewer threads?</p>
  
  <p>Alternatively, what would be the best tool I could use to measure this?...Would a  profiling tool help me out here - indeed, is one of the several profilers better at detecting bottlenecks (assuming I have one here) than the rest?</p>
  
  <p>Note, the server is also running SQL Server 2005 (this may or may not be relevant), but nothing much is happening on that database when I am running my program.</p>
  
  <p>Note also, the threads are only doing string matching, they aren't doing any I/O or database work or anything else they may need to wait on.</p>