博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
客户端多线程下载
阅读量:6064 次
发布时间:2019-06-20

本文共 2388 字,大约阅读时间需要 7 分钟。

hot3.png

//这是主类

package pxy.s2.mutithead; import java.net.; import java.io.; public class MutiThread {

/**** * 多线程的下载 * 在客服端采用多条线程进行下载 * 效率会高很多 * 多线程的关键步骤有: * 首先读取网络资料的大小:根据其大小也在本地创建一个一样大小的文件 * A:计算每个线程的下载开始和结束点:比如:假如我们客服端开启5个线程进行 * 下载:则每个线程的负责的段有:资源的长度/线程数=每个线程的负责下载的段 * 假设这里有5个线程id,从0--4--依次开始负责下载自己的段 * 则有: int start=i*block; * int end=(i+1)*block -1; * 所以各个线程只负责其下载--不关联其他的线程 *  */public static void main(String[] args) throws Exception{	//要下载的网络资料路径	String path="http://127.0.0.1:8080/json/StarUML.rar";	MutiThread.load(path,9);}private static void load(String path,int t) throws Exception{		URL url = new URL(path);	HttpURLConnection con=(HttpURLConnection)url.openConnection();	con.setRequestMethod("GET");//设置请求的方法	con.setReadTimeout(5000);//设置链接的时间	int len=con.getContentLength();//获取网络资源的长度    File file = new File(MutiThread.getContentName(path));//创建一个本地文件,并和网络资源文件的大小一样	RandomAccessFile af = new RandomAccessFile(file, "rwd");	af.setLength(len);//设置本地文件的大小和网络资源一样大	int block=(len%t)==0?len/t:len/t+1;//获取每个线程负责的下载的区域	/***	 * 以下是开启线程进行下载任务	 * 根据传来的线程数T进行开启	 */	for(int i=0;i

}

//以下是子类 package pxy.s2.mutithead;

import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL;

public class DownLoad extends Thread{

private int i;//标识一个线程的IDprivate File file;//本地文件private URL url;//负责链接的URLprivate int block;//每个线程下载的块的大小public DownLoad(int i, File file, URL url, int block) {	this.i=i;	this.file=file;	this.url=url;	this.block=block;}public void run(){		/***	 * 开始进行下载的处理	 */		int start=i*block;	int end=(i+1)*block-1;	try {		HttpURLConnection con = (HttpURLConnection)url.openConnection();		con.setReadTimeout(5000);		con.setRequestMethod("GET");		con.setRequestProperty("Range", "bytes="+start+"-"+end);//设置头字段--根据其下载的区域设置		//创建一个随机file		RandomAccessFile af = new RandomAccessFile(file,"rwd");		af.seek(start);//在这里写入数据		if(con.getResponseCode() == 206){//多线程下载的返回状态码为:206--不是200			InputStream in = con.getInputStream();			byte buf[] = new byte[1024];			int len=0;			while((len=in.read(buf))!=-1){				af.write(buf,0,len);			}			af.close();			in.close();			System.out.println("第"+i+"线程下载完成");		}else{			System.out.println("第"+i+"线程没有完成下载");		}			} catch (IOException e) {		// TODO Auto-generated catch block		e.printStackTrace();	}		}

}

转载于:https://my.oschina.net/u/617513/blog/94602

你可能感兴趣的文章
hadoop datanode 启动出错
查看>>
js颜色拾取器
查看>>
IDEA使用(1)intellIJ idea 配置 svn
查看>>
Thread Safety in Java(java中的线程安全)
查看>>
WPF 降低.net framework到4.0
查看>>
数据管理DMS 全量SQL诊断:你的SQL是健康的蓝色,还是危险的红色?
查看>>
搭建一个通用的脚手架
查看>>
开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
查看>>
开源磁盘加密软件VeraCrypt教程
查看>>
本地vs云:大数据厮杀的最终幸存者会是谁?
查看>>
阿里云公共镜像、自定义镜像、共享镜像和镜像市场的区别 ...
查看>>
shadowtunnel v1.7 发布:新增上级负载均衡支持独立密码
查看>>
IdleHandler,页面启动优化神器
查看>>
Java线程:什么是线程
查看>>
mysql5.7 创建一个超级管理员
查看>>
【框架整合】Maven-SpringMVC3.X+Spring3.X+MyBatis3-日志、JSON解析、表关联查询等均已配置好...
查看>>
要想成为高级Java程序员需要具备哪些知识呢?
查看>>
带着问题去学习--Nginx配置解析(一)
查看>>
onix-文件系统
查看>>
java.io.Serializable浅析
查看>>