看你的代码,每个线程执行一次都会sleep(1000),第一个线程启动后,在启动第二个线程的过程中会先sleep,而此时第一个线程正在下载,开始的时候当然肯定不会是同时的了,不过等所有线程都启动后,就是同时下载了

解决方案 »

  1.   

    看你的代码应该没问题,请问,System.out.println("Thread-"+id+" started.")你的这个打印,第2个线程启动是不是都在第一个线程下载结束才执行呢?
      

  2.   


    我将sleep注释掉之后,还是一样的。并没有同时进行。在两个线程执行完:
    System.out.println("Thread-"+id+" started.");
    之后,第一个线程先下载50%,第二个线程才启动下载。是不是因为两个线程同时往同一个文件(RandomAccessFile)写内容,会引起阻塞啊?
      

  3.   


    是啊!有时是在第一个线程执行的快结束的时候才开始下载。我测试用的下载的文件有100M左右。每次都是这样。用5个线程的时候,也是一个一个地下载。“rwd”   打开以便读取和写入,对于 “rw”,还要求对文件内容的每个更新都同步写入到底层存储设备,估计是这个同步导致的,你使用“rw”模式试试
      

  4.   


    是啊!有时是在第一个线程执行的快结束的时候才开始下载。我测试用的下载的文件有100M左右。每次都是这样。用5个线程的时候,也是一个一个地下载。“rwd”   打开以便读取和写入,对于 “rw”,还要求对文件内容的每个更新都同步写入到底层存储设备,估计是这个同步导致的,你使用“rw”模式试试谢谢你的回答,我已经找到了原因了。应该是InputStream引起的阻塞。添加下面的代码之后就OK了。
    HttpURLConnection conn=(HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Range", "bytes="+startPos+"-"+(startPos+currentSize-1));