Было бы целесообразным использовать поток для получения объектов, полученных с помощью InputStream сокета, а затем добавить их в ConcurrentLinkedQueue, чтобы они могли быть доступны из основного потока без блокировки во входном цикле опроса?Java Sockets listener
private Queue<Packet> packetQueue = new ConcurrentLinkedQueue<Packet>();
private ObjectInputStream fromServer; //this is the input stream of the server
public void startListening()
{
Thread listeningThread = new Thread()
{
public void run()
{
while(isConnected()) //check if the socket is connected to anything
{
try {
packetQueue.offer((Packet) fromServer.readObject()); //add packet to queue
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
listeningThread.start(); //start the thread
}
public Packet getNextPacket()
{
return packetQueue.poll(); //get the next packet in the queue
}
Вам нужно поймать 'EOFException' и выйти из цикла чтения, когда вы его получите, и все другие' IOExceptions', кроме 'SocketTimeoutException' также являются фатальными. Ваш вызов 'join()' также не будет работать: он просто попытается присоединиться к себе, который будет просто блокироваться навсегда, поскольку поток не может умереть, пока он заблокирован в 'join()'. Я действительно не вижу смысла вашего предложения. – EJP
Постоянное чтение с сервера до тех пор, пока клиент не отключит IE: получено более одного объекта, а произвольное число будет точнее –
Я вижу, что делает ваш код, и я уже много раз прокомментировал его. То, что я не вижу, - это точка вашего предложения о очереди. И каково ваше определение «подходящий»? Вопрос действительно не подлежит ответу без указания ваших требований. – EJP