我目前正在使用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'是一個線程。線程沒有功能。 –