自分で小さな爬虫類を飼う(5)--単一スレッドのマルチスレッド


この時点では主に4つのクラスが作成された:Config.java、DownPage.java、GetURL.java、DownImage.java. TextでJAvaクラスでテストするときは単独でテストするため、何の問題もなく、すべての機能が正常に使用できますが、いくつかの機能が同時に実行されると問題が発生します.いくつかの容器があるからjava、GetURL.JAvaとDownImage.JAvaの3つのクラスはそれぞれのコンテナを監視しており、データがあればすぐに作業を開始し、リスニングを完了するには異なるスレッドが必要です.各クラスには少なくとも1つのスレッドが必要です.Javaでマルチスレッドを実装するには、Threadクラスを継承する方法と、Runnableインタフェースを実装する方法の2つがあります.ここでは実装インタフェースを選択します.上記の3つのクラスでは,Runnableインタフェースのrun()メソッドを実現する.
DownPage.java:
@Override
public void run() {
    try {
        while(true){
            while(getPage(URLFactory.URL_LIST.poll())){
                    Thread.sleep(200);
            }
                Thread.sleep(1000);
        }
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

 
 
GetURL.java:
@Override
public void run() {
    try {
        while(true){
            while(getURL(URLFactory.FILE_LIST.poll())){               
                Thread.sleep(100);
            }
            Thread.sleep(1000);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

 
DownImage.java:
@Override
public void run() {
    try {
        while(true){
            while(saveImage(URLFactory.IMAGE_LIST.poll())){
                Thread.sleep(100);
            }   
            Thread.sleep(1000);
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

 
各run()にはダブルwhileサイクルが用いられ,外層のサイクルは容器にデータがないときに待つために用いられることがわかる.内層のループは、200ミリ秒間隔でデータを取り出して処理するために使用される.それからJAvaでテスト:
DownPage downPage = new DownPage();
Thread threadDownPage = new Thread(downPage);
GetURL getURL = new GetURL();
Thread threadGetURL = new Thread(getURL);
DownImage downImage = new DownImage();
Thread threadDownImage = new Thread(downImage);
URLFactory.URL_LIST.put("http://catcoder.com");
threadDownPage.start();
threadGetURL.start();
threadDownImage.start();

 
機能が正常に動作しています.単一スレッドの初歩的に利用可能な爬虫プログラムは初歩的に完成しました.つまり、うん、実行できますが、距離はまだ距離があります.次に行う必要があるのは、重複URLを除去し、重複画像を除去し、本格的なマルチスレッドです.