私は小さなアプリを書いていますが、今では問題を発見しました。アプリのウィンドウに遅れることなく、1つ(後で2つ)のメソッド(このメソッドは何かを読み込んで結果を返す)を呼び出す必要があります。
Executor
やCallable
のようなクラスを見つけましたが、これらのクラスを操作する方法がわかりません。
私に役立つ解決策を投稿してください。
すべてのアドバイスをありがとう。
編集:メソッド[〜#〜] 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ブロック)。
まず、 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
スレッドなど、開いている他のスレッドと並行して実行されます。 :)
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);
_
Java 8で、必要なパラメーターがない場合は、以下を使用できます。
new Thread(MyClass::doWork).start();
またはパラメータの場合:
new Thread(() -> doWork(someParam))