スレッドを使って同時にひたすらHTTPリクエストするスクリプト……を Ruby で作ってうまくいかなかったので、泣く泣く Java で作りなおし。
せっかくなので、いままで使ったことがなかった Java 5.0(JDK1.5? Java 2 SDK 5.0? いまいちバージョンがわかりづらいな) で作ってみる。
import java.io.*;
import java.net.*;
import java.util.*;
 
public class Attack {
 
  private static class Accessor extends Thread {
    private static int counter;
    private final URL url;
    private final int number;
    private Accessor(URL url){
      this.number = counter++;
      this.url = url;
    }
    public void run(){
      HttpURLConnection con = null;
      try{
        con = (HttpURLConnection)url.openConnection();
        con.connect();
        System.out.println(
          "[" + number + "]" + con.getResponseCode());
        con.disconnect();
      }catch(IOException e){
        e.printStackTrace();
      }finally{
        if(con != null){
          con.disconnect();
        }
      }
    }
  }
 
  public static void main(String[] args) throws Exception {
 
    String filepath = args[0];
 
    int alltime = -1;
    if(args.length > 1){
      alltime = Integer.parseInt(args[1]);
    }
 
    List urls = new ArrayList();
    {
      BufferedReader in = null;
      try{
        in = new BufferedReader(new FileReader(filepath));
        String url;
        while((url = in.readLine()) != null){
          urls.add(url);
        }
      }catch(IOException e){
        e.printStackTrace();
      }finally{
        if(in != null){
          in.close();
        }
      }
    }
 
    List accessors = new ArrayList();
    for(String url : urls){
      accessors.add(new Accessor(new URL(url)));
    }
 
    long interval = 0;
    if(alltime != -1){
      interval =
        (long)(((double)alltime / urls.size()) * 1000.0);
    }
 
    long begintime = System.currentTimeMillis();
    for(Accessor a : accessors){
      a.start();
      Thread.sleep(interval);
    }
    for(Accessor a : accessors){
      a.join();
    }
    long endtime   = System.currentTimeMillis();
    System.out.println("[Time]" + (endtime - begintime));
  }
 
}
    
とりあえず、ジェネリックスと foreach な感じのコレクションの反復処理を使ってみた。
参考:
- Java 2 Platform Standard Edition 5.0 Development Kit (JDK 5.0)
 - 総称 (Generics)
- Generics
 - JDK 5.0 ドキュメント - Java プログラミング言語 - 汎用型
 - JSR 14: Add Generic Types To The JavaTM Programming Language
 
 - 拡張 for ループ (Enhanced for Loop)
- The For-Each Loop
 - JDK 5.0 ドキュメント - Java プログラミング言語 - For-Each ループ
 - JSR 201: Extending the JavaTM Programming Language with Enumerations, Autoboxing, Enhanced for loops and Static Import
 
 
tags: zlashdot Java Java
Posted by NI-Lab. (@nilab)
 

コメント
Generics 使われてる形跡がないんですが(笑
拡張 for 文は、(環境依存かもしれないけれど) size() を取りながら int でまわすより遅いことがあるので注意。
投稿者: カリウド | 2005年05月19日 17:48
ありゃ? ほんとだ、Generics 使ってないや (^_^;
一度、Generics で書いたあと、拡張 for を使うときに要らなくなって消しちゃったかな。
拡張 for が遅いのは、Iterable だっけそんな Iterator 使ってますよ的なことをしているからとか?
J2SE 5.0 Tiger 虎の穴 拡張 for 文
http://www5.airnet.ne.jp/sakuraba/java/laboratory/J2SE1.5/LangSpec/ExtendedFor/ExtendedFor.html
っぽいね。
投稿者: NI-Lab. | 2005年05月19日 22:55