Javaでマルチスレッドプログラムを作成しています。ここでは、新しいクライアント接続を処理するために別のスレッドを作成しています。私持っている:私は持っているClientHandlerのスレッドでJavaのサーバープログラムでSocketオブジェクトへの参照を渡す
Socket s;
while(true)
{
s = server.accept();
ClientHandler ch = new ClientHandler(s);
Thread servingThread = new Thread(ch);
servingThread.start();
}
:
public class ClientHandler implements Runnable
{
private Socket s;
public ClientHandler(Socket _Socket, boolean _accepted, BaseStation _bs)
{
this.s = _Socket;
}
をJavaで私は、オブジェクトが、それへの参照のみを渡すことができない場合は、それが問題を引き起こすことが起こっていませんserver
が新しい接続を受け入れるたびに、ClientHandler内のs
インスタンスに接続しますか? ClientHandler
の内部でも変更されず、破損しますか?もしそうなら、正しい方法は何ですか?
normalocity - http://stackoverflow.com/questions/589919/does-java-pass-by-reference、http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526 -pass.htmlなど、Javaが最初に値渡しすることを確認します。 – ziesemer
正確には、Javaはまず値で渡され、次に参照によって渡されます。 :-) – ziesemer
値で解決される「コンテナ」を渡して、実際の参照として値を維持して、参照渡しを強制することができます。 I.E.、Socket [] socketHolder =新しいソケット[1]; socketHolder [0] = sです。 OPが単純に "s"ではなくsocketHolder [0]を使用した場合、彼は実際には参照によってソケットを渡してしまい、問題が発生します。 – ziesemer