web-dev-qa-db-ja.com

新しいスレッドでメソッドを呼び出す簡単な方法

私は小さなアプリを書いていますが、今では問題を発見しました。アプリのウィンドウに遅れることなく、1つ(後で2つ)のメソッド(このメソッドは何かを読み込んで結果を返す)を呼び出す必要があります。

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

私に役立つ解決策を投稿してください。

すべてのアドバイスをありがとう。

編集:メソッド[〜#〜] must [〜#〜]は結果を返します。この結果はパラメータに依存します。このようなもの:

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 out(catchブロック)。

12
Sk1X1

まず、 Java Thread Documentation をご覧になることをお勧めします。

スレッドを使用すると、Runnableと呼ばれるインターフェイスタイプを渡すことができます。ドキュメントは here にあります。ランナブルは、runメソッドを持つオブジェクトです。スレッドを開始すると、この実行可能オブジェクトのrunメソッドにあるコードを呼び出します。例えば:

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

これが意味するのは、t.start()を呼び出すとき、メインスレッドを遅らせることなく、必要なコードを実行します。これはAsynchronousメソッド呼び出しと呼ばれます。つまり、mainスレッドなど、開いている他のスレッドと並行して実行されます。 :)

26
christopher

Java 8なので、より短い形式を使用できます。

_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 、例: 実行可能 または 呼び出し可能

更新2:ファイアアンドフォーゲットタスクの実行にJava.util.concurrent.Executors#newSingleThreadExecutor()を利用することを強くお勧めします。

例:

_Executors
    .newSingleThreadExecutor()
    .submit(Example::someMethod);
_

詳細: _Platform.runLater_およびJavaFXのTaskメソッド参照

30
Andrii Abramov

Java 8で、必要なパラメーターがない場合は、以下を使用できます。

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

またはパラメータの場合:

new Thread(() -> doWork(someParam))
6
Rahul Singh