|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.
annegu做了一个复杂的Http多线程的下载程序,来会商一下多线程并发下载和断点续传的成绩。
这个程序的功效,就是能够分多个线程从方针地点高低载数据,每一个线程负责下载一部分,并能够撑持断点续传和超时重连。
下载的办法是download(),它吸收两个参数,分离是要下载的页面的url和编码体例。在这个卖力下载的办法中,次要分了三个步骤。第一步是用来设置断点续传时分的一些信息的,第二步就是次要的分多线程来下载了,最初是数据的合并。
1、多线程下载:
/** *//** http://www.bt285.cn http://www.5a520.cn
*/
public String download(String urlStr, String charset) {
this.charset = charset;
long contentLength = 0;
CountDownLatch latch = new CountDownLatch(threadNum);
long[] startPos = new long[threadNum];
long endPos = 0;
try {
// 从url中取得下载的文件格局与名字
this.fileName = urlStr.substring(urlStr.lastIndexOf("/") + 1);
this.url = new URL(urlStr);
URLConnection con = url.openConnection();
setHeader(con);
// 失掉content的长度
contentLength = con.getContentLength();
// 把context分为threadNum段的话,每段的长度。
this.threadLength = contentLength / threadNum;
// 第一步,剖析已下载的一时文件,设置断点,假如是新的下载义务,则创建方针文件。在第4点中申明。
startPos = setThreadBreakpoint(fileDir, fileName, contentLength, startPos);
//第二步,分多个线程下载文件
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < threadNum; i++) {
// 创立子线程来卖力下载数据,每段数据的起始地位为(threadLength * i + 已下载长度)
startPos[i] += threadLength * i;
/**//*设置子线程的停止地位,非最初一个线程即为(threadLength * (i + 1) - 1)
最初一个线程的停止地位即为下载内容的长度*/
if (i == threadNum - 1) {
endPos = contentLength;
} else {
endPos = threadLength * (i + 1) - 1;
}
// 开启子线程,并实行。
ChildThread thread = new ChildThread(this, latch, i, startPos[i], endPos);
childThreads[i] = thread;
exec.execute(thread);
}
try {
// 守候CountdownLatch旌旗灯号为0,暗示一切子线程都停止。
latch.await();
exec.shutdown();
// 第三步,把分段下载上去的一时文件中的内容写进方针文件中。在第3点中申明。
tempFileToTargetFile(childThreads);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
<p>
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。 |
|