2013-04-07 11 views
8

私は小さなアプリケーションを書いていますが、今問題が発見されました。 私は1つ(後で多分2)メソッドを呼び出す必要があります(このメソッドは何かをロードして結果を返します)。新しいスレッドでメソッドを呼び出す簡単な方法

私はExecutorまたはCallableのようなクラスを見つけましたが、これらのクラスを操作する方法はわかりません。

私に役立つ解決策を投稿できますか?

すべてのアドバイスありがとうございます。

編集:メソッドは、に結果を返します。この結果はパラメータに依存します。このような 何か:

public static HtmlPage getPage(String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
     return webClient.getPage(page); 
} 

この方法は、約8〜10秒で動作します。このメソッドを実行すると、スレッドを停止できます。しかし、私は2分ごとにメソッドを呼び出す必要があります。

編集:私はこれでコードを編集した:このコードで

public static HtmlPage getPage(final String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
    Thread thread = new Thread() { 
     public void run() { 
      try { 
       loadedPage = webClient.getPage(page); 
      } catch (FailingHttpStatusCodeException | IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    thread.start(); 
    try { 
     return loadedPage; 
    } catch (Exception e) { 
     return null; 
    } 

} 

を私は(私はキャッチブロックのうち、return nullを入れていても)、再びエラーが発生します。

+1

[ 'Executor'](http://docs.oracle。 com/javase/7/docs/api/java/util/concurrent/Executor.html)と['ExecutorService'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent /ExecutorService.html)にはjavadocの例があります。そして、公式チュートリアルの*並行性*スレッドに関する[トピック](http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html)それが私の出発点です。それらの資料で*特定の*を理解していない場合、またはそれらの情報を使用している場合は、新しい質問をする必要があります。 – millimoose

+0

私は例を見た、私は私が欲しいものを達成することはできません芽。 – Sk1X1

+1

I think *あなたが探しているもの['ExecutorService.submit()'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#submit (java.util.concurrent.Callable))を 'Callable 'で置き換えてください。そのため、それらのドキュメントや関連するクラス/メソッドに焦点を当ててください。 'submit()'は、結果が利用可能になったときに何か(UIの更新など)をさせる 'Future 'を返すべきです。 – millimoose

答えて

22

まず、Java Thread Documentationを見ることをおすすめします。

スレッドでは、Runnableというインターフェイスタイプを渡すことができます。ドキュメントはhereです。実行可能ファイルは、runメソッドを持つオブジェクトです。スレッドを開始すると、この実行可能オブジェクトのメソッドrunにあるコードが呼び出されます。たとえば:あなたはt.start()を呼び出すときに今

Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
       // Insert some method call here. 
     } 
}); 

、これが意味する、それがメインスレッドを遅れずにあなたにそれを必要とするものは何でもコードを実行します。これはAsynchronousメソッド呼び出しと呼ばれ、mainスレッドのように、開いている他のスレッドと並行して実行されます。 :)あなたは短い形式を使用できるJava 8以来

+0

私はこのようなものを試してみましたが、うまくいきませんでした(次の答えの詳細) – Sk1X1

+0

呼び出し元のメソッドに引数を渡す方法 –

20

:更新

new Thread(() -> { 
    // Insert some method call here. 
}).start(); 

を: また、あなたがメソッドのリファレンスを使用することができます。

class Example { 

    public static void main(String[] args){ 
     new Thread(Example::someMethod).start(); 
    } 

    public static void someMethod(){ 
     // Insert some code here 
    } 

} 

あなたはときにそれを使用することができます引数リストは、必要な場合と同じです@FunctionalInterface、例えばRunnableまたはCallable

詳細はPlatform.runLater and Task in JavaFX,Method Referencesです。Javaの8で

1

は、あなたが使用できる必要はパラメータが存在しない場合:

new Thread(MyClass::doWork).start(); 

またはパラメータの場合

new Thread(() -> doWork(someParam)) 
+0

それは相対的です。パラメータは隠されており、インタフェースの入力パラメータに依存します。 '新しいスレッド(MyClass :: doWork).start();'を書くと、 'new Thread(() - > doWork())も書くことができます。' For Runabbleには入力パラメータはありません。しかし、クロージャの外側にある変数からの入力が必要な場合は、そうすることで2番目の方法を実行できます。 –