First, you should use java.nio to get non-blocking I/O. Assuming you can't, for some reason...
You can easily have your server handle data from multiple clients using DatagramSocket and a work-queue, such as java.util.concurrent.ThreadPoolExecutor.
The idea is that you have a single receiver thread reading the socket, and each datagram is received, wrapped in a "ReceivedDatagram" object and dropped onto the work-queue. The work-queue has a thread pool whose threads dequeue and process each packet; if the packet requires a response, the thread sends the response (blocking) before blocking to dequeue another ReceivedDatagram.
To send data asynchronously, you simply put a "SendDatagram" object on the work-queue which represents a DatagramPacket to send.
Note, you will be using Datagram.receive(DatagramPacket) and Datagram.send(DatagramPacket).