0

Было бы целесообразным использовать поток для получения объектов, полученных с помощью 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 
} 
+0

Вам нужно поймать 'EOFException' и выйти из цикла чтения, когда вы его получите, и все другие' IOExceptions', кроме 'SocketTimeoutException' также являются фатальными. Ваш вызов 'join()' также не будет работать: он просто попытается присоединиться к себе, который будет просто блокироваться навсегда, поскольку поток не может умереть, пока он заблокирован в 'join()'. Я действительно не вижу смысла вашего предложения. – EJP

+0

Постоянное чтение с сервера до тех пор, пока клиент не отключит IE: получено более одного объекта, а произвольное число будет точнее –

+0

Я вижу, что делает ваш код, и я уже много раз прокомментировал его. То, что я не вижу, - это точка вашего предложения о очереди. И каково ваше определение «подходящий»? Вопрос действительно не подлежит ответу без указания ваших требований. – EJP

ответ

0

Это зависит от того, что вам нужно сделать с этим объектом, который вы будете использовать в основной теме.

Если потребуется какое-то время для его обработки или если оно будет использоваться много раз, чем вы можете поместить его в очередь или в другой класс, который будет удерживать этот объект для вас, но если время, необходимое для его обработки, вам и вам не нужен этот объект дальше после обработки, вам действительно не нужно использовать очередь.

Об использовании ConcurrentQueue тоже может потребоваться заказ? вам нужен гарантированный синхронизм между чтением и записью?

Вы также можете использовать асинхронный сокет, чтобы обрабатывать многие клиенты и обрабатывать их в одном потоке или даже получать из них объекты и бросать очередь для дальнейшего процесса.

Но «быть соответствующим» трудно ответить, потому что зависит от того, что вам нужно делать с этими объектами и как вы справитесь с этим.

+0

Объекты должны быть доступны в том порядке, в котором они получены, и на каждый объект приходится заметное количество времени обработки. и синхронизированная очередь - это потому, что у меня есть второй поток, который будет добавляться в очередь, пока основной поток будет обращаться к ним. –