私は現在、データグラムソケット/パケットを介してUDPを使用してJavaでマルチスレッドサーバー/クライアントを構築しています。スレッドの適切な使用法を理解するのに苦労しており、明確にしたいと思います。まず、私がやっていることの例を挙げます。
Thread a;
Thread b(a);
a.start
b.start
//simple enough, now inside b imagine this,
Thread c(a);
if (case)
{
c.start //therefore I can have a lot of thread c's running at once,
}
//now inside c imagine this
if (case)
{
a.somefunction();
}
最終的に私の質問は非常に難しいですが、上記の sudo はスレッドの適切な使用法ですか? 一度に実行されるスレッドは 1 つだけですが、他の複数の場所から同時にアクセスされる可能性があります。これにより問題が発生しますか?
返信ありがとうございます。
-ウィリアム
さらに明確にするために編集を追加するだけです。
スレッド a がパケットの送信者になり、サーバーからクライアントにパケットを送信します。スレッド b がパケット リスナーになり、クライアントからパケットを受信し、パケット パーサーであるスレッド C に送信します。(そのため、複数のパケットを同時に解析できます)。パケット パーサーであるスレッド c は、クライアントに応答を返す必要がある場合があるため、送信するパケットをキューに入れる a の関数を呼び出します。
再度、感謝します、
もう一度編集して、
関数を使用したサンプル スレッド
package server;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Vector;
public class ServerSenderThread extends Thread
{
DatagramSocket serverSocket;
Vector<DatagramPacket> outGoingPackets = new Vector<DatagramPacket>();
public ServerSenderThread(DatagramSocket serverSocket)
{
this.serverSocket = serverSocket;
}
public void run()
{
while (true)
{
if (outGoingPackets.size() == 0)
{
try
{
Thread.sleep(50);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
else
{
try
{
send();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public void addSend(DatagramPacket packet)
{
outGoingPackets.addElement(packet);
}
public void send() throws IOException
{
DatagramPacket packet = outGoingPackets.get(0);
outGoingPackets.removeElementAt(0);
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] buf = new byte[256];
String dString = "Data Only the Server Knows";
buf = dString.getBytes();
packet = new DatagramPacket(buf, buf.length, address, port);
System.out.println("Sserver sending packet");
serverSocket.send(packet);
}
}