ソケットとデータ入出力ストリームを使用して、クライアント側とサーバー側で Java でゲームを作成しました。サーバー側は、「for」ループですべてのユーザーにメッセージを送信する必要がある場合がありますが、ソケットへの書き込みがブロックされる可能性があるため、メッセージを送信するユーザーごとにスレッドを作成しました (また、リッスンするユーザーごとに別のスレッドを作成しました)。着信メッセージ)。送信スレッドは、次のアイデアに基づいて構築されています。
private ArrayList<Object> messages = new ArrayList<Object>(),
newMessages = new ArrayList<Object>();
public void run() {
while (true) {
for (Object message: messages) {
try {
if (message instanceof Byte)
out.writeByte((Byte)message);
else if (message instanceof Boolean)
out.writeBoolean((Boolean)message);
else if (message instanceof String)
out.writeUTF((String)message);
else if (message instanceof Integer)
out.writeInt((Integer)message);
else if (message instanceof Long)
out.writeLong((Long)message);
} catch (IOException e) {}
}
synchronized (newMessages) {
messages.clear();
messages.addAll(newMessages);
newMessages.clear();
}
}
}
public void write(Object message) {
synchronized (newMessages) {
newMessages.add(message);
}
}
残念ながら、run() メソッドは常に実行されているため、sleep コマンドを挿入して、次のようなことを実現したいと思います。
private ArrayList<Object> messages = new ArrayList<Object>(),
newMessages = new ArrayList<Object>();
public void run() {
while (true) {
try {
if (messages.isEmpty() && newMessages.isEmpty())
sleep(0);
} catch (InterruptedException e) {}
for (Object message: messages) {
try {
if (message instanceof Byte)
out.writeByte((Byte)message);
else if (message instanceof Boolean)
out.writeBoolean((Boolean)message);
else if (message instanceof String)
out.writeUTF((String)message);
else if (message instanceof Integer)
out.writeInt((Integer)message);
else if (message instanceof Long)
out.writeLong((Long)message);
} catch (IOException e) {}
}
synchronized (newMessages) {
messages.clear();
messages.addAll(newMessages);
newMessages.clear();
}
}
}
public void write(Object message) {
synchronized (newMessages) {
newMessages.add(message);
interrupt();
}
}
ただし、これにより、送信するメッセージがある場合にスレッドがスリープ状態になる可能性があります。たとえば、run() メソッドが isEmpty() チェックを行った直後に write() メソッドが呼び出され、true が返されたがまだ開始されていない場合などです。寝るため。sleep(0) でこの問題を回避する方法が本当に思いつかないのですが、誰かアイデアがありますか? それとも、これについて間違った方向に進んでいますか?
本当にありがとう。