写了个小程序,用多线程去抓取一堆文件,编号是连续的,于是我开了100个线程去抓取,运行的时候,报异常了,貌似是栈溢出了。

后来改成20,再去抓取,这次就行了看见一个个那边下载,但是有时候能看见一些异常,这个异常是IO异常,具体不知道原因,因为下载许多个文件才出现一次。

反思

直接在catch中写e.printStackTrace()太糟糕了。除非是简单的一个小调试,测试代码是否能工作。如果真的在正式场合,或者该该异常后面的代码执行会对你的需求产生影响,就需要将其处理了,并且写入到文件中。这样以后才能检查到哪里出了问题。

这样多线程下载文件,不知道哪个没有下载下来,所以以后在处理异常的时候,应该把该异常处理的那个文件编号保存到文件里,这样在下载后就能查看哪个文件没下载完了。

把代码贴出来,这个是我用多线程下载连续文件的方法,并把它分成了好几个部分,每个部分下载自己的那部分,不会妨碍到其他的线程。

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.imageio.ImageIO;

public class SaveFile {
    private int intervalLength = 1000;//每个线程处理的区间长度

    private long finalId = 152000;//最后一个文件的id

    private static ExecutorService pool = Executors.newFixedThreadPool(20);

    private Integer lock=0;//区间的索引值,锁,用于多线程之前的赋值

    /**
     * 下载第i个
     * 
     * @param i
     */
    public void download(long i) {
        //TODO 写自己的下载代码吧
    }

    public void start() {
        System.out.println("has segment:"+finalId/intervalLength);

        for (lock = 0; lock <= finalId/intervalLength; lock++) {

            synchronized (lock) {
                //把当前的区间赋值给临时变量,如果直接用lock,
                //那么多线程里的数值就变成了最后一个了,速度太快了。
                final long a = lock;
                pool.execute(new Runnable() {
                    @Override
                    public void run() {
                        for (long i = a*intervalLength; i < (a+1)*intervalLength; i++) { 

                            download(i);
                        }
                    }
                });
            }

        }
    }

    public static void close(){
        pool.shutdown();
    }

    public static void main(String[] args) {
        SaveFile s=new SaveFile();
        s.start();
        SaveFile.close();
    }
}

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Exception一定要被处理,不只是catch – https://www.chenyudong.com/archives/exception-must-be-resolved.html