カスケード方式で 2 つのスレッドに渡される 2 つのキューの同期を処理しようとしています。したがって、クライアントからの接続をリッスンする ServerThread と、サーバー スレッドによってクライアントからの接続が受け入れられた場合に作成される ConnectedThread の 2 つのスレッドがあります。これらのキューのパスを ConnectedThread クラスのスレッド コンストラクターに同期する方法がわかりません。これらのキューを同期する必要がありますか? そして、何がベストプラクティスなのかわかりません。私はこれをやろうとしました:
synchronized (this) {
new ConnectedThread(socket, inQueue, outQueue).start();
}
とによって:
synchronized (inQueue) {
synchronized (outQueue) {
new ConnectedThread(socket, inQueue, outQueue).start();
}
}
すべてはもちろん"run()"
ServerThread クラスのスレッドのメソッドにあります。
コード内のすべては次のようになります。
private class ServerThread extends Thread {
public ServerThread(int port, Queue<ThreadMessage> in,
Queue<ThreadMessage> out) throws Exception {
// TODO Auto-generated constructor stub
setName("ServerThread");
try {
server = new ServerSocket(port);
synchronized (in) {
synchronized (out) {
inQueue = in; outQueue = out;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
throw new Exception();
}
}
private ServerSocket server;
private Queue<ThreadMessage> inQueue, outQueue;
private boolean running = true;
@Override
public void run() {
// TODO Auto-generated method stub
while (running) {
try {
Socket socket = server.accept();
synchronized (inQueue) {
synchronized (outQueue) {
try {
new ConnectedThread(socket, inQueue, outQueue)
.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
SeverThread クラスのスレッドは、synchronized メソッド内に作成されます。
public synchronized void startServer(int port, Queue<ThreadMessage> in,
Queue<ThreadMessage> out) throws Exception {
serverThread = new ServerThread(port, in, out);
serverThread.start();
}
適切な方法でそれに対処する方法はありますか?
少し早いですがお礼を。
PS私の英語でごめんなさい。PSキューはのインスタンスですLinkedList