今天,我来针对java中的一些网络编程中的多线程下载来进行简单的解析。
首先理解一下多线程下载的原理:
- 如上图所示,有三个人A、B、C去下载MP4,当假设服务器的带宽网速是12M/s,那么三个人每人一个线程就平均每条线程可以分到4M/s
- 但是如果A将占据两条线程,那么现在总共就有4条线程了,
如图:
也就是说12M/s的网速平均每个线程是可以分到3M/s,那么A就分到了6M/s,B分到了3M/s,C也是分到了3M/s,那明显A下载MP4的速度要加快许多,这就是表现出来的多线程的下载一个简单的原理优势。
接着,我们来梳理一下实现多线程下载的步骤:
多线程下载其实就是将资源按线程多少来分段的去下载,那么要分段,首先就得知道所需下载资源的大小,所以先拿到资源大小。
先在内存中创建一个与所下资源,在这里也就是MP4大小的文件,先占好一个足够容下MP4大小的容量。
(原因:是因为如果不先占好位置的话,那么假如MP4的大小是200M,那么假设现在内存是205M,按理来说是内存是够的,那当我们开始下载MP4的中途中,我又下了一个15M的音乐,那么接下来的内存就不够MP4了,这就是为什么刚开始就要占好位置。)接下来就要确定每条线程的开始位置和结束位置了。
先来看个图:(ps:图画的丑,画板不是很会用,莫怪~~~)
在这里我们先假设MP4的大小为10M,现在我开三个线程去分段的下载这个资源,本来应该均分的,但是这里10除以3是除不尽的,那么也如图这样分配,最后一个分配四个。所以在这我们要确定每个线程在文件中开始位置和结束的位置。接下来就真的是用HttpURLconnection以及IO流的知识来进行文件的下载,在这也就是文件的写入。(如不懂IO流,可以参照我转载的上篇博客,IO流详解)
Main代码中:
package com.ecjtu.mutilThread;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
/*
* 先拿到需要下载文件的大小,先不用拿到流
*/
public static final String PATH = "http://192.168.150.1:8088/txvpn_1.08.apk";
public static int threadCount=3;///进行下载的数量
public

本文介绍了Java中实现多线程下载的原理和步骤,包括理解带宽分配、资源大小获取、内存预分配以及线程下载段的确定。通过HttpURLConnection和IO流进行文件下载操作,后续将结合断点续存进行深入探讨。


被折叠的 条评论
为什么被折叠?



