多线程之多个线程同时下载同一个资源文件
发布日期:2022-04-11 08:52:46
浏览次数:13
分类:技术文章
本文共 2857 字,大约阅读时间需要 9 分钟。
多个线程下载同一个资源文件
一个线程下载一部分
package sqy;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.URL;import java.util.concurrent.locks.ReentrantLock;/** * @author suqinyi * @Date 2021/7/1 */public class DownloadUnite { static ReentrantLock lock = new ReentrantLock(); //此方法用于获取一个HttpURLConnection对象 public static HttpURLConnection getConn() throws Exception { String path = "https://www.baidu.com/img/flexible/logo/pc/result.png"; URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setRequestProperty("Accept", "application/x-jpg"); return conn; } //此方法用于创建多线程并且进行下载 public void download() throws Exception { RandomAccessFile file = new RandomAccessFile("picture.jpg", "rw"); HttpURLConnection conn = DownloadUnite.getConn(); int size = conn.getContentLength(); conn.disconnect(); int parts = size / (4 * 1024); DownloadThread[] thread = new DownloadThread[4]; int starts; int ends; System.out.println(size); for (int i = 0; i < 4; i++) { starts = i * parts * 1024; ends = (i + 1) * parts * 1024 - 1; if (i == 3) { ends = size; } thread[i] = new DownloadThread(starts, ends, file); thread[i].start(); } } //将循环读取IO流的操作写入read方法中,用于加锁 public static int read(int starts, int ends, RandomAccessFile file, InputStream pip) throws Exception { lock.lock(); int hasRead = 0; byte[] buffer = new byte[1024]; file.seek(starts); hasRead = pip.read(buffer); starts += hasRead; file.write(buffer, 0, hasRead); lock.unlock(); return starts; } //多线程下载类 class DownloadThread extends Thread { int starts; int ends; RandomAccessFile file; public DownloadThread(int starts, int ends, RandomAccessFile file) { this.starts = starts; this.ends = ends; this.file = file; } public void run() { try { HttpURLConnection conn = (HttpURLConnection) DownloadUnite.getConn(); InputStream pip = conn.getInputStream(); pip.skip(starts); while ((ends - starts) > 0) { //此方法用于加锁 starts = DownloadUnite.read(starts, ends, file, pip); } System.out.println(starts); } catch (Exception e) { e.printStackTrace(); } } } //主方法用于运行程序 public static void main(String[] args) throws Exception { new DownloadUnite().download(); }}
效果:
转载地址:https://blog.csdn.net/qq_44413835/article/details/118515663 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月16日 17时29分25秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
分布式事务 四种方案
2019-04-27
redis和spring整合
2019-04-27
iis6 和iis7s上整个网站重定向
2019-04-27
iis7 url重写和重定向
2019-04-27
navicat工具来将SQL Server数据迁移到MySQL
2019-04-27
XStream xml与javabean之间的互转
2019-04-27
Android应用构建:10:使用sdkmanager管理sdk
2019-04-27
Kubernetes基础:MacOS上设定Dashboard
2019-04-27
#力扣 MySQL:183. 从不订购的客户 @FDDLC
2019-04-27
#力扣 MySQL196. 删除重复的电子邮箱 @FDDLC
2019-04-27
Seekbar 属性 记录
2019-04-27
textview设置独特字颜色和背景颜色
2019-04-27
背景+带边框(圆角)的textview怎么设置
2019-04-27
第二技能
2019-04-27
算法的设计
2019-04-27
WinCE内存管理
2019-04-27
实验: 显式装入DLL时, DLL接口操作封装类
2019-04-27
资源: 辅助工具
2019-04-27
GetLocalIp
2019-04-27