Вы по сути говорите о языке пространственных запросов . Есть много, если вы посмотрите на пространственный запрос, географический запрос и графический запрос. Пространственная часть обычно сводится к точкам, линиям и объектам в регионе, которые имеют другие заданные атрибуты. Регионы могут быть заданы как полигоны, расстояние от точки (например, окружности), расстояние от линейного объекта, такого как дорога, все точки на одной стороне линейного объекта и т. Д. Затем можно перейти к более сложным запросам, таким как набор всех ближайших соседей, кратчайшего пути, коммивояжера и тесселяций, таких как диаграммы TIN Делоне и диаграммы Вороного.
You probably don't want to have the socket from Thread 2 be blocking if you're registering it in a selector (as selectors are meant for non-blocking I/O). I think it's also common practice to let the selector handle the connecting with OP_CONNECT (using SocketChannel.finishConnection()).
It also looks like you could have a potential race condition here. Imagine this series of events:
I'd suggest having Thread 2 set up a SocketChannel, stash it away somewhere Thread 1 can get at it (make sure to be thread safe when you do this), then wake up the selector, let it check it's existing keys in Thread 1 and have Thread 1 register the new SocketChannel before it calls Selector.select() again.