• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Tim Cooke
  • paul wheaton
  • Jeanne Boyarsky
  • Ron McLeod
Sheriffs:
  • Paul Clapham
  • Liutauras Vilda
  • Devaka Cooray
Saloon Keepers:
  • Tim Holloway
  • Roland Mueller
Bartenders:

Threading and collections problem.Pl help

 
Greenhorn
Posts: 6
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Iam stuck in this problem and have spent almost 5-6 hours in it.
In the project i am implementing TCP over UDP.
When stream.activate() is called the following new Thread is implemented

Now the main Thread checks if list has any packets in it
It implements the following code. Basically it checks if there list has any packets in it, if it has it get's the packet and then processes. But some how it doesnt proceed

Now the problem is as soon as the process reaches [1], it doesnt proceed forward. It cant be deadlock as their is nothing for deadlock.
 
Bartender
Posts: 4179
22
IntelliJ IDE Python Java
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I don't think you gave us enough code to know what is going wrong. A functional SSCCE is probably required.

Anything that is sent across multiple threads needs to be protected. In the Thread with 'socket.receive(packet);', how is the packet being made, or stored? How about the buffer that becomes part of the packet? Any re-use of the packet or the buffer will cause bad things. You should re-create both the packet and the buffer for each packet the socket tries to receive.

What is actually happening when the main thread 'doesn't proceed any further'? Have you run a profiler to see what the wait is? Are you sure there isn't some exception occuring that you aren't handling appropriately?

I don't know a lot about DatagramPackets, but maybe you should do the getData() call from inside the Thread which receives the packet, and put the results (the byte[]) into the List to be processed later.
 
jatin puri
Greenhorn
Posts: 6
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanks a lot of help.
The socket is an reference for DatagramSocket, and socket.receive(packet) is an inbuilt method which copies information from the packet which it receives from the network and puts the data in packet along with other information like destination address etc.
The reason why i dont execute retrieving the data in the the other thread is, because as you know in UDP there is no internal buffer, hence as soon as the packet arrives from the network it should be received or there will be a packet loss. Hence if i include the code which retrieves data from list and processes it, a lot of processor power will go into that (as in creation of jpacket there are a lot of algorithms implemented in it according to the data in packet).
So in the mean time iam loosing a lot of data. I actually tried that. That way i was almost loosing 50% of the packets.

PS: I have attached the code . Please help if you can
In the file. First say 'in' is an instance of SocketInputStream().
in.activate() is called which initiates a new Thread which only collects packets from network and add's it to the list.
Later when in.readData() is called : It removes packets from the list and later does calculation on that.


 
Steve Luke
Bartender
Posts: 4179
22
IntelliJ IDE Python Java
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi Jatin,

That isn't an SSCCE, I can't really run it to see what is happening (without a lot of work on my end). Can you make a small example that I can copy, compile, and see what is going on?

From what I can tell, though: This has little to do with the collection. It may have something to do with the byte[], the DatagramPacket, or something else. But if the code gets to the buf = packet2.getData(); line, after the System.out statement, then you know that the collection has done its job. What is left is why getData() doesn't do its job, and to explain why and how you think that statement 'is not moving forward'.

Explain more about how you know it is the getData() call that is causing the problem, and how you know that getData() doesn't move forward, versus perhaps a mishandled exception occurring.
 
jatin puri
Greenhorn
Posts: 6
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi Steve, First of all Happy Diwali (Diwali is the biggest festival here in India)
I think i have found the solution to the problem. THe data is completely received. The thing it that can you please explain System.out.println(). Because the problem is if i make 2 threads and run them i


This code only receives the data,
to send packets you can use the below code


Now Run the 1st code and wait for around 20-30 sec to execute the 2nd code.why is it that [1] is not printed when 1st code is implemented and only after 2nd code runs the output is shown.
Similarly in my problem i have found that all the data is arriving but it is not printing on screen.
 
Do the next thing next. That’s a pretty good rule. Read the tiny ad, that’s a pretty good rule, too.
Smokeless wood heat with a rocket mass heater
https://woodheat.net
reply
    Bookmark Topic Watch Topic
  • New Topic