Java nio Селекторное пробуждение

Вы по сути говорите о языке пространственных запросов . Есть много, если вы посмотрите на пространственный запрос, географический запрос и графический запрос. Пространственная часть обычно сводится к точкам, линиям и объектам в регионе, которые имеют другие заданные атрибуты. Регионы могут быть заданы как полигоны, расстояние от точки (например, окружности), расстояние от линейного объекта, такого как дорога, все точки на одной стороне линейного объекта и т. Д. Затем можно перейти к более сложным запросам, таким как набор всех ближайших соседей, кратчайшего пути, коммивояжера и тесселяций, таких как диаграммы TIN Делоне и диаграммы Вороного.

6
задан Nilesh 5 November 2009 в 04:27
поделиться

1 ответ

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:

  1. Thread 1: selector.select()
  2. ... time passes ...
  3. Thread 2: Thread1.selector.wakeup()
  4. Thread 1: checks keys for acceptability
  5. Thread 1: checks keys for readibility
  6. Thread 1: loop
  7. Thread 1: selector.select()
  8. Thread 2: try to register in the selector (but it's too late for this select())

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.

4
ответ дан 17 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: