日期:2014-05-20  浏览次数:20624 次

java多线程下载的问题?
各位大虾,我刚学java,按照书上的自己写了一个多线程下载的工具,但是运行时却没有同时运行多个线程,而是顺序运行的。
main函数中已经将下载划分为2个线程下载:

DThreadtasks=new DThread[max_num];
for(int i=0;i<max_num;i++){
long start=i*perLen;
RandomAccessFile currentPart=new RandomAccessFile(destFileName,"rwd");
currentPart.seek(start);
tasks[i]=new DThread(i,strUrl,currentPart,start,perLen,0);
tasks[i].start();
}


下载线程代码如下:

public class DThread extends Thread {
String strUrl=null;
URL url=null;
int id;
RandomAccessFile destFile=null;
long size=0;
long startPart;
long hasRead=0;
long startPos;
public DThread(int id,String src,RandomAccessFile destFile,long start,long length,long hasRead){
this.id=id;
this.strUrl=src;
this.destFile=destFile;
this.size=length;
this.startPart=start;
this.hasRead=hasRead;

this.startPos=this.startPart+this.hasRead;
}

public long getHasRead(){
return this.hasRead;
}

@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
// destFile.seek(startPos);
System.out.println("Thread-"+id+" started.");
Thread.sleep(1000);
url=new URL(strUrl);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setReadTimeout(50000);
conn.setRequestMethod("GET");
InputStream ins=conn.getInputStream();
ins.skip(startPos);
byte[] buffer = new byte[DTask.BUFFER_SIZE];
int read=0;

while(hasRead<size && (read=ins.read(buffer))!=-1){
destFile.write(buffer, 0, read);
hasRead+=read;
System.out.println("Thread-"+id+" has Read "+hasRead);
}

destFile.close();
ins.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
mkLogger logger=new mkLogger("DThread");
logger.log("Error URL:"+strUrl);
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}




运行后,结果是
Thread-0先下载50%,然后Thread-1才开始下载剩下的50%。而不是同时下载的。半天不知道怎么回事,求解?

------解决方案--------------------
看你的代码,每个线程执行一次都会sleep(1000),第一个线程启动后,在启动第二个线程的过程中会先sleep,而此时第一个线程正在下载,开始的时候当然肯定不会是同时的了,不过等所有线程都启动后,就是同时下载了
------解决方案--------------------
看你的代码应该没问题,请问,System.out.println("Thread-"+id+" started.")你的这个打印,第2个线程启动是不是都在第一个线程下载结束才执行呢?