java线程:多线程下载文件_java多线程下载文件_井AL的博客-程序员宅基地

技术标签: java  

多线程下载文件

创建类继承Thread类
重写run()方法

package com.downLoad;

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


public class DownLoad extends Thread{
    
    private int startIndex;//线程开始下载位置
    private int endIndex;//线程结束下载位置
    private int threadId;//线程编号

    public DownLoad(int startIndex, int endIndex, int threadId) {
    
        this.startIndex = startIndex;
        this.endIndex = endIndex;
        this.threadId = threadId;
    }

    @Override
    public void run() {
    
        try {
    
            //统一资源管理器  ,可以直接打开 网络地址
            URL url  = new URL(DownLoadTest.path);
            //因为基于http请求 , 获取HttpURLConnection   , 获取网络链接对象 ,就可以和服务器建立链接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置一些参数
            conn.setRequestMethod("GET");   //get请求
            conn.setConnectTimeout(5000);   //链接超时
            conn.setReadTimeout(5000);      //读取超时
            conn.setRequestProperty("Range","bytes="+startIndex+"-"+endIndex);//设置 范围 请求参数  , 获取 线程下载范围

            if(conn.getResponseCode()==206){
        //部分数据 ok
                //取出 链接中的 数据
                InputStream is = conn.getInputStream(); //存储的是服务器上面  百度客户端数据
                //提供一个接收地方(本地接收)
                File file = new File("BaiduNetdisk_6.9.7.4.exe");
                //输出流  ,开始写数据  ,随机读写 流
                RandomAccessFile raf = new RandomAccessFile(file,"rwd");
                raf.seek(startIndex); //跳转到 每个线程 开始读取的位置
                System.out.println("线程:"+threadId+" 开始的位置:"+startIndex+"---"+" 结束位置"+endIndex);
                int len = 0;
                byte[] buf = new byte[1024];
                while((len=is.read(buf))!=-1){
    
                    raf.write(buf,0,len);
                }
                System.out.println("线程:"+threadId+"下载完毕...");
                raf.close();
                DownLoadTest.finishedThread++;
                //如果所有线程都下载完毕 ,让finishedThread 为0
                synchronized (DownLoadTest.path){
    
                    DownLoadTest.finishedThread=0;
                }
            }
        } catch (Exception e) {
    
            e.printStackTrace();
        }
    }
}

创建多线程测试类

package com.downLoad;

import java.net.HttpURLConnection;
import java.net.URL;
/**
 * 多线程测试类
 */
public class DownLoadTest {
    

    static String path = "http://softforspeed.51xiazai.cn/down/BaiduNetdisk_6.9.7.4.exe";

    static int threadCount = 3; //3个线程
    static int finishedThread = 0;  //和 线程数 有关  ,记录每一个线程是否执行完毕

    public static void main(String[] args) throws Exception {
    

        //统一资源管理器  ,可以直接打开 网络地址
        URL url  = new URL(DownLoadTest.path);
        //因为基于http请求 , 获取HttpURLConnection   , 获取网络链接对象 ,就可以和服务器建立链接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //设置一些参数
        conn.setRequestMethod("GET");   //get请求
        conn.setConnectTimeout(5000);   //链接超时
        conn.setReadTimeout(5000);      //读取超时

        if(conn.getResponseCode()==200){
    
            //1. 拿到 文件总长 (总大小)
            int contentLength = conn.getContentLength();
            //2. 每个线程下载的大小
            int size = contentLength/threadCount;
            //3.开启线程执行下载
            for (int i = 0; i < threadCount; i++) {
    
                int startIndex = i*size;        // (i从0开始 )
                int endIndex = (i+1)*size;     //结束位置
                DownLoad thread = new DownLoad(startIndex,endIndex,i);
                thread.start();
            }
        }
    }
}

执行结果:

在这里插入图片描述
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44965204/article/details/107482259

智能推荐

LeetCode 257——二叉树的所有路径(递归)-程序员宅基地

一、题目介绍给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。示例:输入: 1/ \2 3\ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3来源:力扣(LeetCode)链接:https://l...

java 数据库排序_java -通用sql排序语句-程序员宅基地

升序(asc)降序(desc)//年龄进行升序排序 (默认升序排列)select *from t_user order by age;select *from t_user order by age asc;+----+-----------+-----+--------+---------+| id | name | age | gender | content |+----+----..._通用的排序语句

openstack的基本用法_openstack 查看创建的用户-程序员宅基地

目录keystoneglancenovaneutroncinderswiftkeystone1、域 domain查看域的信息列表openstack domain list创建一个新域,名为“yun”openstack domain create yun查看新域的详细信息openstack domain show yun删除新域,需更改域中“enable”为“disable”openstack domain set --disable yunopenstack domain delete_openstack 查看创建的用户

32. 封装行为,不只是状态_智能体的封装-程序员宅基地

封装行为,不只是状态 系统理论中,处理巨大、复杂的系统结构时,包容是最有用的构造之一。软件行业中,包容或封装的价值已深入人心。程序语言的结构,如子程序、函数、模块、类等都支持包容了。 模块和包代表了大尺度的封装,而类、子程序和函数代表了更细粒度的。这些年来,我发现类看起来像是程序员最难正确应用的封装。一个有着3000行代码的主方法的类,或者仅有其原始属性的set_智能体的封装

第四课 Go容器化微服务系统实战-链路追踪观望台_道教儒佛电磁波的博客-程序员宅基地

第四课 Go容器化微服务系统实战-链路追踪观望台tags:GO慕课网categories:链路追踪jaeger数据库外键数据库事务文章目录第四课 Go容器化微服务系统实战-链路追踪观望台第一节 链路追踪简介1.1 链路追踪jaeger基本介绍1.2 jaeger-术语**Span**1.3 jaeger的调用过程1.4 jaeger的组件1.5 jaeger安装和常用端口第二节 商品模块开发2.1 商品模块目录建立2.2 商品模块代码proto开发2.3 商品模块domain的m

(可直接运行版本)python实现yolov3调用摄像头实时监测_yolov3预测怎么改成摄像头输入-程序员宅基地

yolov3目标实时监测,实时识别。可对人物,动物,自行车等多种目标实时识别。运行环境: python+cv2+jupyter notebook+Keras可直接运行:代码下载地址:https://download.csdn.net/download/weixin_44754046/11200480..._yolov3预测怎么改成摄像头输入

随便推点

Maven打包包含依赖的可执行Jar – Maven Assembly Plugin-程序员宅基地

原文地址:http://www.mkyong.com/maven/create-a-fat-jar-file-maven-assembly-plugin/ org.apache.maven.plugins maven-assembly-plugin 2.4.1 jar-with-dependenc

解决首次在eclipse中使用maven构建hadoop等项目时报Missing artifact sun.jdk:tools:jar:1.5.0的问题...-程序员宅基地

问题原因:  eclipse中的maven插件默认没有引用环境变量,所以找不到jdk的路径,也就找不到tool.jar。解决办法:步骤如下:1.关闭eclips2.在eclipse的解压目录中与eclipse启动图标相同的文件夹下找到eclipse.ini文件,在该文件的-vmargs上面加上-vmC:\Program Files\Java\jdk1.7.0_79\jre\...

cmake Debug模式和Release模式-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ..._cmake dll qt debug模式

数据结构与算法-程序员宅基地

为什么80%的码农都做不了架构师?>>> ...

平流式沉淀池表面负荷怎么计算_高效沉淀池的表面负荷如何计算-程序员宅基地

通常高效沉淀池的表面负荷取值范围为1.0-3.0m³/(㎡*h),若是计算当前正运行的高效沉淀池的表面负荷流量/沉淀池表面积=表面负荷若是从设计角度考虑需要综合工艺流程,污水性状,沉淀速度,沉淀区污泥容积,排泥量,排泥频率等参数进行设计。高效沉淀池的表面负荷,国内手册与国外的标准相差很大,国内都在1.5左右,而国外都在0.6-0.8之间,我比较倾向国外的,不过问题是表面负荷低,土建的费用就高!斜管..._高效沉淀池表面负荷

Qt Creator编写无人机地面站系统_qt 无人机地面站系统 导航模块-程序员宅基地

1.登录界面1.1登录主界面1.2用户注册界面1.3修改密码界面_qt 无人机地面站系统 导航模块