2012-01-24 11 views
0

私は、twitterをpingするJavaクラス(スレッド)を作成したいと考えています。接続がなくても接続が確立してから、他のクラスやスレッドを再実行するまで待ちません。 ウェブサイトに「ping」し、すべての静的メソッドを実行するためのコードがMainクラスにあります。これは問題の良い解決策ですか?ここでjavaでtimeOutクラスを作成する

は、コードの基本的な部分である:

while (true){ 
try { 
final URLConnection connection = new URL(url).openConnection(); 
connection.connect(); 
} 
catch (Exception e) { 
    Thread.sleep(10000*t); 
if (url.matches(twitter1)){ 
     Thread method1= new Thread(Class1.method1); 
     method1.start(); 
}else if (url.matches(twitter2)){ 
     Thread method2 = new Thread(Class1.method2); 
     method2.start(); 
}else if (url.matches(twitter3)){ 
     Main.StaticMethod(); 
}else if (url.matches(twitter4)){ 
     Main.StaticMethod2(); 
}else if (url.matches(twitter5)){ 
     Main.StaticMethod3(); 
}else{ 
     System.out.println("Unknown URL"); 
} 
t=2^t; 
} 
} 
+0

[タイマーの使用](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html) – AJG85

答えて

0

はどのようにクラスを「実行する」を定義しますか?これを行う1つの方法は、timeOutクラスにこれらのクラスへの参照を格納してから、サイトに正常にpingを実行するときに必要なメソッドを呼び出すことです。

1

あなたはクラスまたはスレッドを実行していない、あなただけのメソッドを呼び出すことができます。メソッドがinstance methodsの場合は、objectが必要です。それ以外の場合はstaticであり、定義されているclassを知る必要があります。別のthreadを開始する場合は、objectclassimplements Runnableである必要があります。例えば

try { 
    final URLConnection connection = new URL(url).openConnection(); 
    connection.connect(); 
    } catch (Exception e) { 
    } 
    // connection is available, either use it or close it. then, 

    // AfterConnect is a class that implements Runnable. Perhaps it takes 
    // the connection as parameter? 
    AfterConnect afterConnect = new AfterConnect(..); 

// this will start a new thread 
    new Thread(afterConnect).start(); 

ところで、あなたの例では、 "接続があるまで待つ" しません。 try...catchをループに入れる場合は、反復の間にしばらくの間sleepする必要があります。

0

「他のいくつかのクラスとスレッドを再実行する」構造をどうやって構築したのかよく分かりません。それはメソッド呼び出しの寄せ集めであるならば、あなたは抽象クラスで提示のコードを入れて、抽象メソッドを追加することができ

abstract class AbstractTimeout { 
    ... your code here, but add a call to afterConnection() ... 

    protected abstract void afterConnection(); 
} 

サブクラスすべてのクラスのオブジェクトのためのいくつかのフィールドを設定することでこれを実現するでしょうその後、これはinheritance古典である

protected void afterConnection() { 
    class1.goDoThis(); 
    object2.goDoThat(); 
    someRunnable.run(); 
    // ... etc... 
} 

で通話の寄せ集めを実施し、コンストラクタで呼び出します。ところで、あなたは例外が投げられるかもしれないと宣言することを検討する必要があります。簡単にするために、私はその問題を無視しました。 「再実行し、いくつかの他のクラスとスレッド」のものはかなりシンプルでよくRunnableのように構成何かにすでにある場合

あるいは、あなたのクラスは、引数としてURLConnection、ランと一緒にRunnableを取るかもしれません接続が完了した後でRunnableを呼び出す(または新しいスレッドで起動する)。これは古典的なの組成です。例えば

public void doTimeout(URL url, Runnable afterConnection) { 
     // your connection stuff from above 

     afterConnection.run(); 
    } 

注:私はdoTimeoutはすでにそれ自身のスレッドであるべきだと思う原因私は、スレッドにafterConnection.runを()入れていません。 YMMV。

注2:私の2番目のソリューションは@Miserable Variable afterConnect()の概念に似ています。私はRunnableを使用し、より柔軟なインターフェースを使用しました。

関連する問題