 <p>Ok, I downloaded your zip and ran the program. Your problem isn't in the matrix multiplication at all. The advice in the comments is still valid about reducing the number of threads, however as it stands the multiplication happens very quickly.</p> <p>The actual problem is in your <code>writeToAFile</code> method - all the single-threaded CPU utilization you are seeing is actually happening in there, after the multiplication is already complete.</p> <p>The way you're appending your strings:</p> <pre><code>fileOutputString = fileOutputString + resultMatrix[i][j] </code></pre> <p>creates thousands of new <code>String</code> objects which then immediately become garbage; this is very inefficient. You should be using a <code>StringBuilder</code> instead, something like this:</p> <pre><code>StringBuilder sb=new StringBuilder(); for (int i = 0; i &lt; resultMatrix.length; i++) { for (int j = 0; j &lt; resultMatrix[i].length; j++) { sb.append(resultMatrix[i][j]); if (j != resultMatrix[i].length - 1) sb.append(","); } sb.append("\n"); } String fileOutputString=sb.toString(); </code></pre> <p>That code executes in a fraction of a second.</p>