1

この問題を解決する方法がわかりません。お役に立てば幸いです。

サーバー側の後ろに私はこれを持っています:

class Baza0 implements Runnable{  

     anotherclass arraylist_handle = new anotherclass();

public method1(string s1){uses methods figured in arraylist_handle)

public run(){
  while(true){
   Socket s = s.accept();
   if(s==NULL) continue;
   
   //there I'm starting another thread that handles client  connection
  }   
}
 public static void main(){
   Baza0 baza0 = new Baza0();
   Thread t = new Thread(baza0); 
 }
}

接続されたクライアントは、socketserver 機能によって文字列をクライアント ハンドラに送信します。この文字列をクライアント ハンドラーから method1 にパラメーターとして送信するにはどうすればよいですか? ArrayList はすべてのクライアントに共通でなければならないため、Baza0 オブジェクトを 1 つだけ使用する必要があります。

編集

Baza0.baza0.method1() のようなものが機能しない理由を教えてもらえますか?

EDIT2

私がしたことを見てください!

クラス Baza0 で静的変数を作成しました。

static Baza0 baza1;

main メソッドで Baza0 オブジェクトを開始しました。

Baza0 baza0 = new Baza0();

この後、baza1 = baza0 を作成するメソッドを実行します。

クライアントハンドラーから、次の方法でメソッドにアクセスできます。

Baza0.baza1.method1(param);

それはうまくいきます!:D ...理由がわからない.

4

4 に答える 4

2
  1. 読み取り専用にarraylistを使用している場合は、すべての子スレッドが同時に自由にアクセスできます。
  2. スレッドがリストを変更したい場合、リストはスレッドセーフでなければなりません。
  3. 変更に多くのステップ(読み取りと書き込み)が含まれる場合はsynchronized、リストとの「トランザクション」が発生するブロックを使用する必要があります。
于 2013-01-19T16:14:16.407 に答える
1

クライアントスレッドには、それへの参照が必要ですArrayList-直接または(より良い)間接的に。Baza0これを行う最も簡単な方法は、インスタンス(this)をクライアントスレッドに渡すことです。

public class Client implements Runnable {

    private final Baza0 baza;

    public Client(Baza0 baza) {
        this.baza = baza;
    }

    public void run() {
        //...
        baza.method1("Some string");
    }

}

Clientスレッドを作成するときは、次のパスを渡すだけthisです。

new Thread(new Client(this)).start();

重要なスレッドセーフの問題:method1()同期するか、ArrayListスレッドセーフである必要があります。

于 2013-01-19T16:15:49.323 に答える
1

Baza0の呼び出しに使用できるクライアントハンドラスレッドへの参照を渡しmethod1ます。

public method1(string s1){
    synchonized(arrayList){
        //list operation 
    }
}
...
while(true){
   Socket s = s.accept();
   if(s==NULL) continue;
   new Thread(
            new WorkerRunnable(
                clientSocket, this).start();

  }   

...。

public class WorkerRunnable implements Runnable{
  public WorkerRunnable(Socket socket,Baza0 ba){
     this.socket = socket;
     this.baza =ba;
  }
  public void run(){
     ...
     this.ba.method1(...);
  }
}
于 2013-01-19T16:17:20.623 に答える
1

@Marko Topolnikが言ったことを言います。また、私はJava Concurrency In Practiceという本を持っています(それは今のところ私に応答していません :-()、またはスレッドの問題を処理するための Java スペシャリストのブログに私をこの本に導いたリンクです。この本にはすべてのキューの例があります。 、並行リスト、同期リスト、いくつかのことを行うコードを実装する方法など、すべて非常に簡単で、すべての主題の例といくつかの段落です。

于 2013-01-19T17:18:06.730 に答える