多线程下载

/**

  • 多线程下载实现类
  • 1.建立成员变量,描述多线程下载需要的参数
  • 2.通过统一资源管理器URL,和要下载的资源建立连接
  •  设置参数信息
    
  • 3.获取网络资源的输入流,得到数据
  • 4.创建文件存放的file对象,
  • 5.具体文件下载的实现
  • 6.关闭流

*/
public class DownLoad extends Thread{
private int startIndex;//开始位置
private int endIndex;//结束位置
private int threadId;//线程编号
public DownLoad(int startIndex, int endIndex, int threadId) {
super();
this.startIndex = startIndex;
this.endIndex = endIndex;
this.threadId = threadId;
}
@Override
public void run() {
long start = System.currentTimeMillis();
try {
// 2.通过统一资源管理器URL,和要下载的资源建立连接
URL url = new URL(DownLoadTest.path);
//获取联系
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置参数信息
conn.setRequestMethod(“GET”);//get方式请求
conn.setConnectTimeout(5000);//连接超时
conn.setReadTimeout(5000);//读取超时
conn.addRequestProperty(“Range”, “bytes=”+startIndex+"-"+endIndex);//设置读取的范围,固定格式的
System.out.println(this.currentThread().getName()+" “+threadId+”:下载的文件范围:"+startIndex+"-"+endIndex);
if(conn.getResponseCode()206) {//部分数据ok
// 3.获取网络资源的输入流,得到数据
InputStream is = conn.getInputStream();
// 4.创建文件存放的file对象,
File distFile = new File(“D:\upload\xxx.zip”);
//创建读写随机流
RandomAccessFile raf = new RandomAccessFile(distFile, “rwd”);
raf.seek(startIndex);//指定写入的开始位置
// 5.具体文件下载的实现
byte[] buf =new byte[8192];
int len = 0;
while((len= is.read(buf))!=-1) {
raf.write(buf, 0, len);
}
// 6.关闭流
raf.close();
is.close();
//线程完成次数加1
DownLoadTest.okThread++;
//加锁
synchronized (DownLoadTest.path) {
System.out.println(this.currentThread().getName()+" “+threadId+”:线程下载完成!"+DownLoadTest.okThread);
//判断如果线程完成数量达到了线程数,重置成0
if(DownLoadTest.okThread
DownLoadTest.threadCount) {
DownLoadTest.okThread=0;
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println(this.currentThread().getName()+“下载子线程运行的时间:”+(end-start));
}

}

/**

  • 下载测试类
  • @author wyl
    *通过统一资源管理器,连接网络资源,获取文件的大小

*调用多线程实现具体 的下载
*
*/
public class DownLoadTest {

static String path = "https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.25-winx64.zip";
static int threadCount=3;//线程的数量
static int okThread=0;//已经下载完成的线程数量
public static void main(String[] args) throws Exception {
	long start = System.currentTimeMillis();

// 通过统一资源管理器URL,和要下载的资源建立连接
URL url = new URL(DownLoadTest.path);
//获取联系
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置参数信息
conn.setRequestMethod(“GET”);//get方式请求
conn.setConnectTimeout(5000);//连接超时
conn.setReadTimeout(5000);//读取超时

	if(conn.getResponseCode()==200) {
		int count = conn.getContentLength();//文件的长度
		int size = count / threadCount;//每个线程需要下载的文件长度
		System.out.println(count);
		System.out.println(size);
		for (int i = 0; i < threadCount; i++) {
			int startIndex = size*i;
			int endIndex = size*(i+1);
			DownLoad thread= new DownLoad(startIndex, endIndex, i);
			thread.start();
		}
		
	}
	long end = System.currentTimeMillis();
	System.out.println("主线的时间:"+(end-start));
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值