Как оставить внешние соединения с условиями

Я знаю, что перезапустить использованный объект Java Thread невозможно, но я не нашел объяснения, почему это не разрешено; даже если гарантировано, что поток завершен (см. примерный код ниже).

Мое гадание состоит в том, что потоки могут быть напрямую привязаны (для эффективности или других ограничений) к фактическому native , которые могут быть перезапущены в некоторых операционных системах, но не в других. Если разработчики языка Java разрешили перезапускать Threads, они могут ограничить количество операционных систем, на которых может работать JVM.

Подумайте об этом, я не могу думать о ОС который позволяет перезапустить поток или процесс после его завершения или завершения. Когда процесс завершается, он умирает. Вы хотите другой, вы перезапустите его. Вы никогда не воскрешаете его.

. Помимо вопросов эффективности и ограничений, налагаемых базовой ОС, есть проблема анализа и рассуждений. Вы можете рассуждать о параллелизме, когда вещи либо неизменяемы, либо имеют дискретный, конечный срок службы. Как и государственные машины, они должны иметь состояние терминала. Это началось, дожидаясь, закончилось? Такие вещи не могут быть легко обоснованы, если вы разрешаете Threads воскресать.

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

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

0
задан sawa 13 July 2018 в 08:33
поделиться

3 ответа

Поскольку у вас есть общее условие where, вы можете использовать includes . Это сгенерирует запрос LEFT OUTER JOIN:

Action.includes(:actions_users).where(actions_users: { user_id: true })

Или, если вы используете Rails 5+, Active Record предоставляет метод поиска left_outer_joins :

Action.left_outer_joins(:actions_users).where(actions_users: { user_id: true })

0
ответ дан John Baker 17 August 2018 в 13:24
поделиться
Action.left_outer_joins(:actions_users).where(user_id: 1)

select *
from actions left outer join actions_users
on actions_users.action_id = actions.id and actions_users.user_id = 1
where actions.user_id = 1

Хотя вы еще не просили об этом, ...

Action.left_outer_joins(:actions_users).where(actions_users: {status: 'active'})

select *
from actions left outer join actions_users
on actions_users.action_id = actions.id and actions_users.user_id = 1
where actions_users.status = 'active'
0
ответ дан Marlin Pierce 17 August 2018 в 13:24
поделиться

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

Action.joins("left outer join action_users on (action_users.id = actions.id and action_users.id = 1")).where('action_users.user_id = ? ', 1)
0
ответ дан Pardeep Saini 17 August 2018 в 13:24
поделиться
Другие вопросы по тегам:

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