2017-02-16 13 views
2

私はHTTPリクエストを処理するREST Webサービスを持っています。データがデータベースからフェッチされた後、バックグラウンドスレッドを実行してデータの分析を開始します。これには、完了に時間がかかります。このデータはレスポンスとは何の関係もなく、計算された分析を記録するだけです。非同期スレッドでバックグラウンド計算を実行する方法(REST Webサービスで)

私はスレッドの概念を自分で理解して、以下の方法を試しました。しかし、どちらの場合も、バックグラウンド計算が終了した直後にHTTPレスポンスが返されるため、計算スレッドと元のスレッドは非同期ではなく、計算スレッドは解析が完了するまで応答スレッドを停止します。

  1. デーモンスレッドを開始しました。デーモンスレッドがバックグラウンドで実行されると予想しましたが、HTTPメソッドは応答を送信します。しかし、真実ではありません。応答は、このスレッドで計算が完了した後でのみ表示されます。親スレッドが終了してもデーモンスレッドはバックグラウンドで実行されませんか?計算スレッド私は親スレッド内で作成された子スレッドです:

    Callable<Boolean> computeCallable = new CallableComputeProcess();
    Thread t=new Thread(computeCallable);
    t.setDaemon(true);
    t.start();

P.Sは(デーモンを起動すると、ここで問題となっていたかもしれない方法を知って、ジェームズのコメントを読んでください)。

スレッドを非同期で開始する方法はありますか?バックグラウンド計算をHTTPレスポンスを停止せずにバックグラウンドで実行できるようにする方法はありますか?

私はFutureTaskのコンセプトとExecutorServiceのを使用し、私は()メソッドを取得する呼び出すことはありませんれている:自分の質問に答える

+1

再、 "私は、にデーモンスレッドを期待...しかし..." あなたは誰かがしたい場合はあなたのコードが何をしたのかを説明してください。そして、あなたはコードを見せなければなりません。 –

+0

確かに@jameslarge。コードの追加 – kai

+1

Re、 "デーモンスレッドを開始しました。"それが 't.setDaemon()'と呼ばれた場合、おそらくそれは悪い考えです。 Javaの用語では、「デーモン」スレッドは、プログラム内で実行されている他の非デーモンスレッドがない場合に自動的に強制終了されるスレッドです。あなたはおそらく、有用な計算をしながら自動的に殺されるスレッドをwan'tしないでしょう。スレッドの唯一の目的が何らかのサービスを他のスレッドに提供することであるならば 'setDaemon()'を呼び出すべきです。 –

答えて

1

rxJavaを試してみてください。

Flowable.fromCallable(() -> { 
 
    Thread.sleep(1000); // imitate expensive computation 
 
    return "Done"; 
 
}) 
 
    .subscribeOn(Schedulers.io()) 
 
    .observeOn(Schedulers.single()) 
 
    .subscribe(System.out::println, Throwable::printStackTrace);

https://github.com/ReactiveX/RxJava

+0

@dresありがとうございます。プロジェクトがJava 1.7のようにこれを実装するためにいつかかかります:) – kai

+1

ラムダを除いた例と同じことになります。新しい匿名の呼び出し可能関数を作成するだけです。 – dres

0

。我々が知っているように、focus doesn't shift to the thread(with the FutureTask) until we call FutureTask.get() method。 get()メソッドを呼び出したことはないので、計算スレッドはバックグラウンドで実行され、HTTPレスポンスは返されます。計算が終わるまで、バックグラウンドで実行し続けます。

ExecutorService executor = Executors.newFixedThreadPool(1); 

Callable<Boolean> computeCallable = new CallableComputeProcess(); 

executor.submit(scimCallable); 

そしてCallableComputeProcessはこのように書き:

public class CallableComputeProcess implements Callable<Boolean> { 
public Boolean call() { 
     //do computation 
     return true; 
    } 
} 

これが停止しない/応答を行い、バックグラウンドで実行され、メインスレッドを妨げます。より多くの柔軟性を高めるため

関連する問題