多线程之多个线程同时下载同一个资源文件
发布日期: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秒