title: download a file in java using multi threading
body: <p>I'm working on a downloader similar to IDM, I hava read <a href="https://stackoverflow.com/questions/7502718/java-download-multiple-files-using-threads">This</a> post about it. and I have implement my first-steps of code.</p>
  
  <p>Here is the Downloader Class's Code:</p>
  
  <pre><code>package download.manager;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.nio.channels.ReadableByteChannel;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  
  
  public class Downloader implements Runnable{
  
      private String url;
      private int num;
      private long start;
      private long end;
      ReadableByteChannel rbc;
  
      public Downloader(String url, int num, long start, long end, ReadableByteChannel rbc) {
          this.url = url;
          this.num = num;
          this.start = start;
          this.end = end;
          this.rbc = rbc;
      }        
  
      @Override
      public void run() {
          download();
      }
  
      private void download(){
          try {
              System.out.println(num + " is executing");
              URL file = new URL(url);
              FileOutputStream stream = new FileOutputStream("tmp"+num);                        
              stream.getChannel().transferFrom(rbc, start, end);
          } catch (MalformedURLException ex) {
              Logger.getLogger(Downloader.class.getName()).log(Level.SEVERE, null, ex);
          } catch (IOException ex) {
              Logger.getLogger(Downloader.class.getName()).log(Level.SEVERE, null, ex);
          }
  
      }
  
  }
  </code></pre>
  
  <p>and this is my main function:</p>
  
  <pre><code>package download.manager;
  
  import java.io.IOException;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.nio.channels.Channels;
  import java.nio.channels.ReadableByteChannel;
  import java.util.concurrent.ExecutorService;
  import java.util.concurrent.Executors;
  import java.util.concurrent.TimeUnit;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  
  /**
   *
   * @author Behzad
   */
  public class DownloadManager {
  
      /**
       * @param args the command line arguments
       */
      public static void main(String[] args) {
  
          URL file = null;
          ReadableByteChannel rbc = null;
          try {                       
              String url = "http://dl1.video.varzesh3.com/video/clip93/12/video/havashi/top5_save_derby_dortmond.mp4";
              file = new URL(url);
              rbc = Channels.newChannel(file.openStream());
              int size = file.openConnection().getContentLength(); 
              ExecutorService pool = Executors.newFixedThreadPool(4);
              int partSize = size / 4;
              pool.submit(new Downloader(url, 1, 0, partSize, rbc));
              pool.submit(new Downloader(url, 2, partSize, partSize, rbc));
              pool.submit(new Downloader(url, 3, 2 * partSize, partSize, rbc));
              pool.submit(new Downloader(url, 4, 3 * partSize, partSize, rbc));            
              pool.shutdown();
              pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
          } catch (MalformedURLException | InterruptedException ex) {
              Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE, null, ex);
          } catch (IOException ex) {
              Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE, null, ex);
          }
  
  
  
      }
  
  }
  </code></pre>
  
  <p>but when I run this code the downloader downloads just first part of file. as you see in the picture</p>
  
  <p><img src="https://i.stack.imgur.com/4AIMU.png" alt="enter image description here"></p>
  
  <p>what should I do for this ? </p>
  
  <p>Here is updated download method :</p>
  
  <pre><code>private void download(){
          try {
              System.out.println(num + " is executing");
              URL file = new URL(url);
              ReadableByteChannel rbc = Channels.newChannel(file.openStream());
              FileOutputStream stream = new FileOutputStream("tmp"+num);                        
              stream.getChannel().transferFrom(rbc, start, end);
          } catch (MalformedURLException ex) {
              Logger.getLogger(Downloader.class.getName()).log(Level.SEVERE, null, ex);
          } catch (IOException ex) {
              Logger.getLogger(Downloader.class.getName()).log(Level.SEVERE, null, ex);
          }
  
      }
  </code></pre>