多线程下载资源
来源:互联网 发布:域名和url的区别 编辑:程序博客网 时间:2024/05/19 15:20
多线程下载服务器端资源思路如下:
1,在android 客户端首先创建一个空文件,空白文件大小和服务器文件大小一样。
2,开启若干线程分别去下载服务器端对应的资源。
3. 如果所有的线程都下载完毕,服务器端资源就被下载完毕。
我们遇到的问题:
a,如何划分服务器端资源。
b, 每个线程资源的开始和结束位置。
1》获取服务器端资源文件的大小。
long size = conn.getContentLength();
2》根据开启线程的数量,把服务器的资源等分为若干份。
size: 表示服务器端资源的大小
threadCount:表示要开启的线程数量
blocksize = size /threadCount; 表示每个线程要下载资源的大小。
for (int i = 1; i <= threadCount; i++) {System.out.println("开启线程" + i);long startIndex = (i - 1) * blocksize;long endIndex = i * blocksize-1;// 最后一个线程if (i == threadCount) {endIndex = size-1;}System.out.println("开启线程" + i + "下载的位置" + startIndex + "~~" + endIndex);}
比如开启3个线程,服务器资源大小为10.
第一个线程下载的资源:0~~2
第二个线程要下载的资源:3~~5
第三个线程要下载的资源:6~~9
完整代码如下:
package com.zhq.demo;import java.io.File;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;public class TestDownload {// 线程数量private static int threadCount = 3;// 每个区块的大小private static Long blocksize;public static void main(String[] args) throws Exception {String path = "http://localhost:8080/DownLoadTest/sqllite.dmg";URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);int code = conn.getResponseCode();if (code == 200) {long size = conn.getContentLength();System.out.println("size==" + size);blocksize = size / threadCount;// 1. 本地创建一个大小跟服务器一模一样的空白文件。File file = new File("temp.dmg");RandomAccessFile raf1 = new RandomAccessFile(file, "rw");raf1.setLength(size);// 2. 开启若干个自线程分别去下载对应的资源。for (int i = 1; i <= threadCount; i++) {System.out.println("开启线程" + i);long startIndex = (i - 1) * blocksize;long endIndex = i * blocksize-1;// 最后一个线程if (i == threadCount) {endIndex = size-1;}System.out.println("开启线程" + i + "下载的位置" + startIndex + "~~" + endIndex);new DownLoadThread(path, i, startIndex, endIndex).start();}}conn.disconnect();}private static class DownLoadThread extends Thread {private int threadId;private long startIndex;private long endIndex;private String path;public DownLoadThread(String path,int threadId, long startIndex, long endIndex) {this.path=path;this.threadId = threadId;this.startIndex = startIndex;this.endIndex = endIndex;}@Overridepublic void run() {try {URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");//conn.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);conn.setRequestProperty("Range", "bytes=" + startIndex + "-"+ endIndex);conn.setConnectTimeout(5000);int code = conn.getResponseCode();System.out.println("code=="+code); InputStream is=conn.getInputStream(); File file=new File("temp.dmg"); RandomAccessFile raf=new RandomAccessFile(file, "rw"); raf.seek(startIndex); System.out.println("第"+threadId+"个线程:写文件的开始位置"+String.valueOf(startIndex)); int len=0; byte[]buffer =new byte[1024];while ((len = is.read(buffer)) != -1) {raf.write(buffer, 0, len);} is.close(); raf.close(); System.out.println("线程"+threadId+"下载完毕了");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} }}}
0 0
- 多线程下载WEB资源
- 多线程下载资源
- python多线程+队列下载资源
- 多线程下载服务端图片资源
- Android多线程下载服务器资源
- JAVA 多线程下载单个资源
- Unity多线程资源下载方案
- python 多线程 +队列下载资源
- unity3d之http多线程异步资源下载
- Unity3D之http多线程异步资源下载
- HttpURLConnection实现多线程下载资源contentLength()
- [Unity]AssetBundle资源更新以及多线程下载
- [Unity]AssetBundle资源更新以及多线程下载
- java多线程下载web上的资源数据
- [原]unity3d之http多线程异步资源下载
- Ubuntu上用wget多线程下载大文件资源
- 资源下载
- 资源下载
- Nginx配置文件nginx.conf中文详解
- 第十一周 哈夫曼树
- spring+mybatis配置多数据源总结,重点是动态加载数据源,支持动态切换
- this.standing
- HTML5 postMessage 跨域交换数据
- 多线程下载资源
- Spring Boot基础|使用nohup运行jar文件
- MediaTek_ApSoC_SDK_4320_20150414编译问题
- 开始学习Unity
- java基础篇
- redis 基础
- 使用OpenGL在Unity中画一个框
- iOS中UIImageView 添加UITapGestureRecognizer后传参
- kafka centos 单点配置