Я знаю, что перезапустить использованный объект Java Thread невозможно, но я не нашел объяснения, почему это не разрешено; даже если гарантировано, что поток завершен (см. примерный код ниже).
blockquote>Мое гадание состоит в том, что потоки могут быть напрямую привязаны (для эффективности или других ограничений) к фактическому native , которые могут быть перезапущены в некоторых операционных системах, но не в других. Если разработчики языка Java разрешили перезапускать Threads, они могут ограничить количество операционных систем, на которых может работать JVM.
Подумайте об этом, я не могу думать о ОС который позволяет перезапустить поток или процесс после его завершения или завершения. Когда процесс завершается, он умирает. Вы хотите другой, вы перезапустите его. Вы никогда не воскрешаете его.
. Помимо вопросов эффективности и ограничений, налагаемых базовой ОС, есть проблема анализа и рассуждений. Вы можете рассуждать о параллелизме, когда вещи либо неизменяемы, либо имеют дискретный, конечный срок службы. Как и государственные машины, они должны иметь состояние терминала. Это началось, дожидаясь, закончилось? Такие вещи не могут быть легко обоснованы, если вы разрешаете Threads воскресать.
Вы также должны учитывать последствия воскрешения потока. Восстановить свой стек, его состояние, безопасно воскресить? Можете ли вы воскресить нить, которая закончилась ненормально? И т. Д.
Слишком волосатый, слишком сложный. Все это для незначительных выгод. Лучше сохранить Threads как нересупретируемые ресурсы.
Поскольку у вас есть общее условие 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 })
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'
Вы можете передать строку в запросе соединения и использовать для этого соглашения об именах таблиц 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)