我目前正在使用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();
}
最终我的问题是非常难问,但上述须藤适当使用线程?即使一次只运行一个线程,它也可以同时从多个其他位置访问。这会造成问题吗?
感谢您的回复。
-William
只需添加编辑以进一步说明。
线程a将是我的数据包发送者,它将数据包从服务器发送到客户端。 线程b将是我的数据包侦听器,它接收来自客户端的数据包,并将它们发送到线程C(数据包解析器)。 (所以我可以同时解析多个数据包)。 线程c,数据包解析器,可能需要向客户端发回一个响应,所以它会调用一个函数来排队一个数据包。再次
感谢,再次
编辑,
样品线程使用功能
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);
}
}
所以在你的例子中,你使用'a'作为线程:'a.start',作为runnable:'c.start(a)'和作为对象:'a.someFunction'。这是令人困惑的,它会帮助发布真实的代码。此外,如果您不确定线程是如何工作的,则可以使用易于使用的高级并发包:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService .html – assylias
Ahh我更正了我的sudo示例中的类型,我可以发布实际的代码,但并未全部实现。我确实了解线程是如何工作的,并且经常使用这些线程,当java让我使用上述实现时,以及在我的应用程序中部署这些线程之前,我只是感到惊讶,即时了解是否会有后果。 – user1972748
“在哪个队列中调用一个函数”我认为'a'是一个线程。线程没有功能。 –