0

データの送信と取得を担当する集中型ソケットクラスがあります。私には2つのクラスがあります:

  • 入力ストリームをリッスンするものと
  • それに書き込みの世話をするもう1つ。

無限ループで実行されているリスニングを実行してから、メッセージを処理します。同期の場合、サーバーから応答を受信したら、読み取りをブロックしてこれらの値をリセットします。

今、私は無気力で立ち往生しています。私のサービスには3つの方法があります。

  1. 何かを得ます
  2. readSomething
  3. 何か言って。

getSomethingの場合、提供されたブールフラグに基づいて非同期機能を実装したいと思います。アプリが起動すると、両方のスレッドも起動し、同時にリクエストを送信します。

たとえば、readSomething最初に、次にgetSomething戻り値を取得しますがreadSomethinggetSomethingこれは私が望むものではなくgetSomething、しばらくすると出力が来ることをログで確認できます。

Futureオブジェクトは、独自のスレッドで実行される新しいタスクを送信する必要があるようですが、このアプリを設計した方法では、新しいスレッドを作成できません。フローチャートなどのように、この無秩序なものをどのように処理する必要があるかについて、誰かが私に洞察を与えることができますか?

4

2 に答える 2

0

非同期で作業を行っている場合、それは、非同期作業がいつ行われたかをアプリケーションの他の部分が気にしないことを意味します。

通常は、非同期作業が完了したときに他の部分に通知します。このためには、 「オブザーバーパターン」を使用する必要があります(記事にはフローチャートが含まれています)。

基本的な考え方は、アプリが非同期作業を開始し、作業が完了すると通知を受けるというものです。そうすれば、アプリケーションの2つの部分を大まかに結合できます。簡単な例:

/**
 * The observer
 */
public interface AsyncWorkDoneListener{

    /**
     * This method will be called when the async-thread is
     *  done.
     */
    public void done(Object unit);

}

/**
 * The worker (which does the asyc-work on another thread).
 */
public class AsyncWorker{

    private AsyncWorkDoneListener listener;

    /**
     * Set (you might want to maintain a list here) the current
     *  listener for this "AsyncWorker".
     */
    public void setListener(AsyncWorkDoneListener listener){
        this.listener = listener;
    }

    /**
     * Will do the async-work
     */
    public void doWork(){
        // Do the work in another thread...
        // When done, notify the registered listener with the
        //  result of the async work:
        this.listener.done(the_object_containing_the_result);
    }
}

/**
 * The application
 */
public class App implements AsyncWorkDoneListener{

    public void someMethod(){
        // Work on something asynchronously:
        mAsyncWorker.setListener(this);
        mAsyncWorker.doWork();
    }

    @Override
    public void done(Object unit){
        // The asyc work has finished, do something with
        //  the result in "unit".
    }
}
于 2012-10-14T11:33:34.443 に答える
0

いくつかの洞察:

  • フローチャートではなく、データフローが必要です

  • タスクごとに新しいスレッドを作成できない場合は、によって作成された固定サイズのスレッドプールを使用できます。java.util.concurrent.Executors.newFixedThreadPool()

  • スレッドプールで実行されているタスク内からFuture.get()を使用することはできません。そうしないと、スレッド不足のデッドロックが発生する可能性があります。

  • 問題の説明が不明確です。宣言されていない概念が多すぎます。「これらの値をリセットする」-どのような値ですか?「私のサービスの3つの方法」-それはサーバー側ですか、それともクライアント側ですか?「ブールフラグが提供されました」-誰がそのフラグを提供したか、そしてそれはどういう意味かを理解する必要がありますか?私たちがお手伝いできるように、実装する必要のあるプログラムのデータフロー表現を提供してください。

于 2012-10-14T12:58:02.097 に答える