week8—多线程下载多个网页文件

week8—多线程下载多个网页文件

博主是个大一学生,最近突发奇想,想通过写博客记录大学生涯中所做的一些实验和作业,如果有什么地方出错的话或者哪里不理解,请大家在下面回复指出,每条回复我都会看的,谢谢大家!

一、题目

下面的程序可以下载多个网页文件(download方法已写好),请将它改成多线程进行下载,如果可能, 显示计算各部分下载完成程序所用的时间(提示:new Date().getTime()可以得到当前时间的毫秒数)。

import java.net.URL;
import java.io.*;
 
class Downloader 
{
    public static void main(String[] args)
        throws Exception
    {
        final URL[] urls = {
            new URL("https://www.pku.edu.cn"),
            new URL("https://www.baidu.com"),
            new URL("https://www.sina.com.cn"),
        };
        final String[] files = {
            "pku.htm", 
            "baidu.htm",
            "sina.htm", 
        };
 
        for(int idx=0; idx<urls.length; idx++){
            try{
                System.out.println( urls[idx] );
                download( urls[idx], files[idx]);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }
    static void download( URL url, String file)
        throws IOException
    {
        try(InputStream input = url.openStream();
            OutputStream output = new FileOutputStream(file))
        {
            byte[] data = new byte[1024];
            int length;
            while((length=input.read(data))!=-1){
                output.write(data,0,length);
            }
        }
    }
}

二、编写

import java.io.*;
import java.net.URL;
import java.util.Date;

public class week8 extends Thread
{
	//获取初始时间
	long d1 = new Date().getTime();
	private URL urls; //远程路径
	private String files; //存储名字
	private int idx;
	
    public week8(URL urls, String files, int idx) {
		this.urls = urls;
		this.files = files;
		this.idx = idx;
	}

	@Override
    public void run() {
            try{
            	System.out.println( urls );
                //调用downLoad方法
                download( urls, files);
            }catch(Exception ex){
                ex.printStackTrace();
            }finally {
            	//获取各部分下载所用时间
            	long d2 = new Date().getTime();
            	System.out.println("第" + (idx+1) + "次下载所用时间:" + (d2-d1) + "ms");
            }
            
    }

	public static void main(String[] args) throws Exception
    {	
    	final URL[] urls = {
                new URL("https://www.pku.edu.cn"),
                new URL("https://www.baidu.com"),
                new URL("https://www.sina.com.cn"),
            };
        final String[] files = {
                "pku.htm", 
                "baidu.htm",
                "sina.htm", 
            };
        for(int idx=0; idx<urls.length; idx++){
        	//创建子类对象
        	week8[] w = new week8[idx+1]; 
        	w[idx] = new week8(urls[idx], files[idx], idx);
        	//启动
        	w[idx].start();
        }
    }
    
    static void download( URL url, String file)

    		throws IOException
    {
        try(InputStream input = url.openStream();
        OutputStream output = new FileOutputStream(file))
        {
            byte[] data = new byte[1024];
            int length;
            while((length=input.read(data))!=-1){
                output.write(data,0,length);
            }
        }catch (IOException e) {
        	e.printStackTrace();
        }
    }
}

三、运行结果
在这里插入图片描述

你可能感兴趣的:(week8—多线程下载多个网页文件)