2012-05-09 13 views
0

私はいくつかのWebページからコンテンツをスクラップする簡単なプログラムを作っています。私はプログラムのスピードを上げてスレッドを使いたいと思っています。私はいくつかの整数でスレッドの量を制御できるようにしたい(私はユーザーがこれを定義できるようにしたい)。スレッドとの混乱、初心者

public void runLocales(String langLocale){ 
    ParseXML parser = new ParseXML(langLocale); 
    int statusCode = parser.getSitemapStatus(); 
    if (statusCode > 0){ 
     for (String page : parser.getUrls()){ 
      urlList.append(page+"\n"); 
     } 
    }else { 
     urlList.append("Connection timed out"); 
    } 
} 

そしてparseXMLクラス:

これは私がスレッドを作成するコードです

public class ParseXML { 
private String sitemapPath; 
private String sitemapName = "sitemap.xml"; 
private String sitemapDomain = "somesite"; 
Connection.Response response = null; 
boolean success = false; 

ParseXML(String langLocale){ 
    sitemapPath = sitemapDomain+"/"+langLocale+"/"+sitemapName; 
    int i = 0; 
    int retries = 3; 

    while (i < retries){ 
     try { 
      response = Jsoup.connect(sitemapPath) 
        .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21") 
        .timeout(10000) 
        .execute(); 
      success = true; 
      break; 
     } catch (IOException e) { 

     } 
     i++; 
    } 
} 

public int getSitemapStatus(){ 
    if(success){ 
     int statusCode = response.statusCode(); 
     return statusCode; 
    }else { 
     return 0; 
    } 
} 

public ArrayList<String> getUrls(){ 
    ArrayList<String> urls = new ArrayList<String>(); 
    try { 
     Document doc = response.parse(); 

     Elements element = doc.select("loc"); 
     for (Element page : element){ 
      urls.add(page.text()); 
     }   
     return urls; 
    } catch (IOException e) { 
     System.out.println(e); 
     return null; 
    } 
} 
} 

私は今、数日間のスレッドについて、最大読んでいると私ができます私の場合にスレッドを実装する方法を理解できませんか?誰かがいくつかの洞察力を提供できますか?

答えて

1

何かが行う必要があります。

new Thread(
     new Runnable() { 
      public void run() { 
       try { 
        runLocales(langLocale); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       System.out.println(
        "child thread " + new Date(System.currentTimeMillis())); 
      } 
     }).start(); 

もちろん、あなたはまだあなたがなど、作成したいどのように多くのスレッドを制御するためのコードを追加し、あなたがあなたのしきい値がある場合に何をしたいのかを決定する必要があります到達した。

1

Excuseme私は明白なことを答えることだし、あなたの問題はあなたが希望する

public class Runner extends Runnable{ 

    private final String langLocale; 

    public Runner(String langLocale){ 
     this.langLocale = langeLocale; 
    } 

    public void run(){ //Instead of public void runLocales(String langLocale) 
     //Do your thing here 
    } 
} 

を定義し、 新しいスレッドを使用して、新しいスレッド(新しいランナーを作成して開始することであるように見え、異なるがあれば( "smth"))。start();

スレッドに参加することを追跡したいので、一度にスレッドがあまりにも多くないようにしてください。そしてその問題が発生したら、Runnablesを直接渡すところでThreadPoolを使うことを検討してください。

そして最後の1つは、クロールするときに、良い市民になる!推奨事項を尊重し、robots.txtファイルを使用し、同じサーバーに2つ以上のスレッドを開かないようにしてください。

楽しいです!

1

ThreadGroupを使用して、維持したいスレッドを制御できます。または、スレッドを制御するためにThreadPoolメカニズムを実装することもできます。

スレッドグループクラスhereの使用をお手伝いできます。

そしてThreadPoolの実装サンプルhere

希望すると、これが役立ちます。

お楽しみください!

関連する問題