3

現在、接続をリッスンしているソケットを実行しているスレッドがあります。接続を受信すると、メインスレッドで収集されたデータをアップロードする必要があります(つまり、メインスレッドからデータを取得します)。ただし、オブジェクトのインスタンスを渡しますが、接続の待機中に収集されたデータで更新されることはありません。

これを行う適切な方法はありますか?グーグルで調べてみましたが、具体的な答えが見つからないようです。

誰かが私を正しい方向に向けることができますか?


うまくいけば、これは理にかなっていますが、例を使ってさらに説明しようと思います。

class MainThread {
    private void MainThread() {
        SomeObj obj = new SomeObj("DATA Needed");

        SecondThread second = new SecondThread(obj);
        second.start();
    }
}

class SecondThread extends Thread {
    SomeObj obj;

    public void SecondThread(Object obj) {
    this.obj = obj;
    }
    public void run() {

    //Listening for connection
    //Connection get!
    //Get updated data (Object obj) from main thread.
    //Upload
    }
}

私はあなたが私に与えることができるどんな助けにも感謝します。私がこれに完全に間違って近づいているかどうか私に知らせてください!私はただ答えを得るよりもむしろ学びそして答えを得たいです。

本当にありがとう!

4

3 に答える 3

2

あるスレッドでの書き込みが別のスレッドで確実に表示されるようにするイベントのセットは限られています。スレッドの作成もその1つであるため、最初にobjに書き込まれたデータはすべて、2番目のスレッドで使用できるようにする必要があります。

1つのオプションは、objで同期することです。メインスレッドが同期メソッドを呼び出すことによってのみ変更し、2番目のスレッドがobj同期メソッドからデータを取得した場合、メインスレッドの書き込みは2番目のスレッドに表示されます。

Javaでのマルチスレッドについて本当に学びたいのであれば、実際のJava同時実行をお勧めします。

于 2012-11-05T04:15:07.307 に答える
1

接続を受信すると、メインスレッドで収集されたデータをアップロードする必要があります(つまり、メインスレッドからデータを取得します)。

スレッドから情報を取得しないため、これは意味がありません。情報を取得し、オブジェクトと通信します。それは大きな違いです。情報が必要なオブジェクトのインスタンスを、おそらくコンストラクターのパラメーターとして、この情報が必要な2番目のオブジェクトに渡す必要があります。次に、このインスタンスを使用してSecondThreadクラスにフィールドを設定し、そのインスタンスでメソッドを呼び出すことができます。

すなわち、

class MainThread {
    private void MainThread() {
        SomeType obj = new SomeType("DATA Needed");

        SecondThread second = new SecondThread(obj);
        second.start();
    }
}

class SecondThread extends Thread {
    SomeType obj;

    public SecondThread(SomeType obj) {
       this.obj = obj;
    }
    public void run() {
      // can call methods on obj here
    }
}

うまくいけば、実際にオブジェクトタイプを使用しているのではなく、はるかに具体的なタイプのオブジェクトを使用しているのではないでしょうか。

于 2012-11-05T03:54:15.117 に答える
1

Hovercraft Full Of Eelsの答えについての私のかなり不可解なコメントを拡張します:

import java.util.concurrent.*; // BlockingQueue

class MainThread {
    private void MainThread() {
        // BlockingQueue is designed to be used primarily for producer-
        // consumer queues, so ALL implementations are thread-safe!
        new UploaderThread(new LinkedBlockingQueue<Data>()).start();
    }
}

class UploaderThread extends Thread {
    private final BlockingQueue<Data> _dataToBeUploaded;
    public SecondThread(BlockingQueue<Data> dataToBeUploaded) {
       _dataToBeUploaded = dataToBeUploaded;
    }
    public void run() {
      while ( true ) {
        // Retrieve the first element in the queue, if necessary waiting 
        // until an element becomes available.
        upload(_dataToBeUploaded.take()); 
      }
    }
}

乾杯。キース。

于 2012-11-05T04:29:52.050 に答える