1.使用了java.util.concurrent包里的线程池,可以飙升到满带宽,在100M带宽上,可以达到10MB/s。

2.使用了java.nio里的channels,性能比自己缓冲有一些提高。

 1 import java.io.FileOutputStream;
2 import java.io.InputStream;
3 import java.net.URL;
4 import java.net.URLConnection;
5 import java.nio.channels.Channels;
6 import java.nio.channels.FileChannel;
7 import java.nio.channels.ReadableByteChannel;
8 import java.util.Calendar;
9 import java.util.concurrent.Callable;
10 import java.util.concurrent.ExecutorService;
11 import java.util.concurrent.Executors;
12
13 public class HttpDownloader implements Callable<String> {
14 URLConnection connection;
15 FileChannel outputChann;
16 public static volatile int count = 0;
17
18 public static void main(String[] args) throws Exception {
19
20 ExecutorService poll = Executors.newFixedThreadPool(100);
21
22 for (int i = 0; i < 100; i++) {
23 Calendar now = Calendar.getInstance();
24 String fileName = "../data/" + now.get(Calendar.YEAR) + "年"
25 + (now.get(Calendar.MONTH) + 1) + "月"
26 + now.get(Calendar.DAY_OF_MONTH) + "日--" + i + ".txt";
27 poll.submit(new HttpDownloader("http://www.sina.com",
28 (new FileOutputStream(fileName)).getChannel()));
29 }
30
31 poll.shutdown();
32
33 long start = System.currentTimeMillis();
34 while (!poll.isTerminated()) {
35 Thread.sleep(1000);
36 System.out.println("已运行"
37 + ((System.currentTimeMillis() - start) / 1000) + "秒,"
38 + HttpDownloader.count + "个任务还在运行");
39 }
40 }
41
42 public HttpDownloader(String url, FileChannel fileChannel) throws Exception {
43 synchronized (HttpDownloader.class) {
44 count++;
45 }
46 connection = (new URL(url)).openConnection();
47 this.outputChann = fileChannel;
48 }
49
50 @Override
51 public String call() throws Exception {
52 connection.connect();
53 InputStream inputStream = connection.getInputStream();
54 ReadableByteChannel rChannel = Channels.newChannel(inputStream);
55 outputChann.transferFrom(rChannel, 0, Integer.MAX_VALUE);
56 // System.out.println(Thread.currentThread().getName() + " completed!");
57 inputStream.close();
58 outputChann.close();
59 synchronized (HttpDownloader.class) {
60 count--;
61 }
62 return null;
63 }
64 }
 1 import java.io.FileOutputStream;
2 import java.io.InputStream;
3 import java.net.URL;
4 import java.net.URLConnection;
5 import java.nio.channels.Channels;
6 import java.nio.channels.FileChannel;
7 import java.nio.channels.ReadableByteChannel;
8 import java.util.Calendar;
9 import java.util.concurrent.Callable;
10 import java.util.concurrent.ExecutorService;
11 import java.util.concurrent.Executors;
12
13 public class HttpDownloader implements Callable<String> {
14 URLConnection connection;
15 FileChannel outputChann;
16 public static volatile int count = 0;
17
18 public static void main(String[] args) throws Exception {
19
20 ExecutorService poll = Executors.newFixedThreadPool(100);
21
22 for (int i = 0; i < 100; i++) {
23 Calendar now = Calendar.getInstance();
24 String fileName = "../data/" + now.get(Calendar.YEAR) + "年"
25 + (now.get(Calendar.MONTH) + 1) + "月"
26 + now.get(Calendar.DAY_OF_MONTH) + "日--" + i + ".txt";
27 poll.submit(new HttpDownloader("http://www.sina.com",
28 (new FileOutputStream(fileName)).getChannel()));
29 }
30
31 poll.shutdown();
32
33 long start = System.currentTimeMillis();
34 while (!poll.isTerminated()) {
35 Thread.sleep(1000);
36 System.out.println("已运行"
37 + ((System.currentTimeMillis() - start) / 1000) + "秒,"
38 + HttpDownloader.count + "个任务还在运行");
39 }
40 }
41
42 public HttpDownloader(String url, FileChannel fileChannel) throws Exception {
43 synchronized (HttpDownloader.class) {
44 count++;
45 }
46 connection = (new URL(url)).openConnection();
47 this.outputChann = fileChannel;
48 }
49
50 @Override
51 public String call() throws Exception {
52 connection.connect();
53 InputStream inputStream = connection.getInputStream();
54 ReadableByteChannel rChannel = Channels.newChannel(inputStream);
55 outputChann.transferFrom(rChannel, 0, Integer.MAX_VALUE);
56 // System.out.println(Thread.currentThread().getName() + " completed!");
57 inputStream.close();
58 outputChann.close();
59 synchronized (HttpDownloader.class) {
60 count--;
61 }
62 return null;
63 }
64 }

java多线程网页下载代码的更多相关文章

  1. Java多线程的下载器(1)

    实现了一个基于Java多线程的下载器,可提供的功能有: 1. 对文件使用多线程下载,并显示每时刻的下载速度. 2. 对多个下载进行管理,包括线程调度,内存管理等. 一:单个文件下载的管理 1. 单文件 ...

  2. 用 python 实现一个多线程网页下载器

    今天上来分享一下昨天实现的一个多线程网页下载器. 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. k ...

  3. java多线程断点下载原理(代码实例演示)

    原文:http://www.open-open.com/lib/view/open1423214229232.html 其实多线程断点下载原理,很简单的,那么我们就来先了解下,如何实现多线程的断点下载 ...

  4. Java多线程断点下载文件

    Java实现断点续传+多线程下载 如下代码所示,每一步都有注解 思路: 通过URL连接到服务器上要下载的文件,得到文件的大小: 算出每条线程下载的开始位置和结束位置,例如,有两条线程下载100Byte ...

  5. java 多线程安全问题-同步代码块

    /* 多线程的安全问题: while(true) { if(tick>0) { //线程0,1,2,3在余票为1时,都停滞在这里,之后分别获得CPU执行权,打印出0,-1,-2等错票 Syste ...

  6. java 多线程断点下载功能

    import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.Rand ...

  7. java多线程批量下载文件

    多线程下载文件 平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果: package test; /** * 文件下载类 * @author luweichen ...

  8. Java多线程断点下载

    public static class DownloadThread extends Thread{ private int threadId; private int startIndex; pri ...

  9. java 多线程断点下载demo

    源码链接 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java ...

  10. java的报表下载代码excel

    /** * 汇总报表数据下载 * */ private ModelAndView exportSummaryDatadown(HttpServletRequest request, HttpServl ...

随机推荐

  1. SpringMVC:SpringMVC执行流程

    目录 SpringMVC常用组件 DispatcherServlet初始化过程 ①初始化WebApplicationContext ②创建WebApplicationContext ③Dispatch ...

  2. vue自定义组件的点击事件失效

    在vue开发过程中为了减少重复代码,很多时候都需要将重复的部分写成一个组件,方便调用.但是使用组件时很可能又会给该组件添加点击事件.如果直接这样写,事件则会失效: 正确写法应该是这样:

  3. 全网最适合入门的面向对象编程教程:45 Python 实现常见数据结构-链表、树、哈希表、图和堆

    全网最适合入门的面向对象编程教程:45 Python 实现常见数据结构-链表.树.哈希表.图和堆 摘要: 数据结构是计算机科学中的一种组织和存储数据的方式,它决定了数据的访问方式和操作效率,数据结构的 ...

  4. CamoTeacher:玩转半监督伪装物体检测,双一致性动态调整样本权重 | ECCV 2024

    论文提出了第一个端到端的半监督伪装目标检测模型CamoTeacher.为了解决半监督伪装目标检测中伪标签中存在的大量噪声问题,包括局部噪声和全局噪声,引入了一种名为双旋转一致性学习(DRCL)的新方法 ...

  5. 小程序bindinput和bindblur赋值延迟问题解决

    小程序bindinput和bindblur赋值延迟问题解决 问题链接:https://developers.weixin.qq.com/community/develop/doc/000a0ebdc4 ...

  6. 【赵渝强老师】利用Python完成数据分布特征的分析

    在对数据的质量进行分析后,接下来就可以对数据的特征进行分析和计算,也可以通过绘制图表对数据的特征进行展示.数据的特征分析通过有以下几种方式:分布分析.对比分析.统计量分析.周期性分析.贡献度分析(帕累 ...

  7. iOS上架App Store使用小结

    1.安装iOS上架辅助软件Appuploader 2.申请iOS发布证书(p12) 3.申请iOS发布描述文件(mobileprovision) 4.打包ipa 5.上传ipa到iTunes Conn ...

  8. 轨道控制器 threejs

    就是一个可以360转动的相机,通过不断的改变相机的参数 然后渲染达到效果. // 引入相机控件  -- 轨道控制器 // console.log('OrbitControls',OrbitContro ...

  9. 简单 webapi 登录成功就返回 电脑的进程信息·

    /// <summary> /// 如果登录成功就返回电脑的进程信息 /// </summary> /// <returns></returns> [H ...

  10. 过滤器 多少时间之前发布 dayjs relative'TrelativeTime

    import dayjs from "dayjs"; import relativveTime from "dayjs/plugin/relativeTime" ...