title: Java 8 automatically using multicore?
body: <p>I did some tests a year ago concerning multicore with java 7. First I implemented some calculations only in the main thread (CPU usage showed that only one core did all the work) and then I implemented Callable with an ExecutorService instance. While running it all cores where doing the work.</p>
  
  <p>Now, one year, later I have to implement a little programm (using java 8) which interpolates a lot of data. All the work is implemented in the main thread (without Callable and ExecutorService) but when I'm running the programm the CPU usage shows me, that all 4 cores are at 98%.</p>
  
  <p>So does java 8 automatically distribute the work on all CPU cores? I'm confused...</p>
  
  <p>Here some code...</p>
  
  <p>MapGenerator.java</p>
  
  <pre><code>    Region[][] regions = new Region[numOfRegions][numOfRegions];
  
      for(int x = 0; x &lt; regions.length; x++){
          for(int z = 0; z &lt; regions[x].length; z++){
              newLat = SRTMHandler.getNewLatitude(startLat, z * regionSize * 16);
              newLon = SRTMHandler.getNewLongitude(startLon, x * regionSize * 16, newLat);
  
              regions[x][z] = new Region(x, z, regionSize, newLat, newLon);
          }
      }
  </code></pre>
  
  <p>Region.java:</p>
  
  <pre><code>private Chunk[] chunks;    
  
  public Region(int x, int z, int size, float startLat, float startLon){
      this.chunks = new Chunk[this.size][this.size];
      //Init stuff
      float newLat = this.startLat, newLon = this.startLon;
  
      for(int newX = 0; newX &lt; this.size; newX++){
          for(int newZ = 0; newZ &lt; this.size; newZ++){
              newLat = SRTMHandler.getNewLatitude(this.startLat, newZ * 16);
              newLon = SRTMHandler.getNewLongitude(this.startLon, newX * 16, newLat);
  
              this.chunks[newX][newZ] = new Chunk(this.x * this.size + newX, this.z * this.size + newZ, 16, 900, this, newLat, newLon);
          }
      }
  }
  </code></pre>
  
  <p>Chunk.java: (SRTMHandler.getHeightForLatLon() does some geo calculations and then reads a value in a byte array, nothing special)</p>
  
  <pre><code>public Chunk(int x, int z, int size, int height, Region r, float startLat, float startLon){
      this.blocks = new Block[size][size][height];
      //Init stuff
  
      try {
          this.calcSurface();
          //System.out.println("Finished " + this.toString());
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
  }
  
  private void calcSurface() throws IOException{
      int x1 = this.x;
      int x2 = this.x + 16;
      int z1 = this.z;
      int z2 = this.z + 16;
      final int radius = 45;
      float q11 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, (-1)*radius), SRTMHandler.getNewLongitude(this.startLon, (-1)*radius, this.startLat));
      float q12 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, radius), SRTMHandler.getNewLongitude(this.startLon, (-1)*radius, this.startLat));
      float q21 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, (-1)*radius), SRTMHandler.getNewLongitude(this.startLon, radius, this.startLon));
      float q22 = SRTMHandler.getHeightForLatLon(SRTMHandler.getNewLatitude(this.startLat, radius), SRTMHandler.getNewLongitude(this.startLon, radius, this.startLat));
  
      for(int x = 0; x &lt; this.blocks.length; x++){
          for(int z = 0; z &lt; this.blocks[x].length; z++){
              float height = Interpolation.biLerp(x, z, q11, q12, q21, q22, x1, x2, z1, z2);
  
              this.blocks[x][z][(int)Math.round(height)] = new Block(this.x * this.size + x, this.z * this.size + z, (int)Math.round(height), BlockType.Grass, this);
          }
      }
  }
  </code></pre>