0

ソケットをリッスンし、(ネットワーク化された)クライアントが参加するときにスレッドの配列に追加する単純なメインクラスがあります(サーバーが新しいチャットクライアントをリッスンし、各クライアントをスレッドとして追加し、リストを維持するように)配列としてのスレッド)。

他のことは機能しています。これらは、サーバーがリッスンし、新しいクライアントを thdRunningClientsPool[] というスレッドの配列に追加するコード行です。

//add a new ClientHandler type object( ClientHandler class extends Thread) to my Thread Array
public void run() {
............
 thdRunningClientsPool[intRunningClients]= new 
                   Thread( new ClientHandler(clientSocket));
 thdRunningClientsPool[intRunningClients].start();

現在、 ClientHandler クラスにはメソッド void SendMessage(string Message) があります

新しいクライアントが追加された後、この SendMessage メソッドを使用してメッセージを送信するにはどうすればよいですか? これを使うと

thdRunningClientsPool[intRunningClients].SendMessage("hi");

SendMessage メソッドが見つかりません。Java は thdRunningClientsPool(intRunningClients) を ClientHandler クラスのオブジェクトとしてではなくスレッドとして扱っているため、SendMessage メソッドにアクセスできません。

どうすればこれを修正できますか? どんなアドバイスでも大歓迎です:) THxxx

4

1 に答える 1

4

まず、一般的なアドバイス:implements Runnableの代わりに を使用してextends Threadください。今後の頭痛の種を大幅に節約できます。

あなたの質問に関しては、インスタンスを引数として渡さsendMessageれたインスタンスを呼び出すことはできません。Threadへの参照を保持するようにコードを変更する必要がありますClientHandlerThread外部インスタンスの配列は実際には必要ありません。それらを開始して手放すだけです。

また、これらすべてのスレッドを自分で開始するという選択を再検討する必要があります。これは、システム リソースを浪費するため、通常は悪い考えです。ただし、コードのその側面を再設計することは、質問の範囲を超えています。

于 2013-01-28T13:24:36.537 に答える