Когда вы пишете это:
Thread.new { ... }
{ ... }
- это блок , который будет выполняться новым потоком. Если вы хотите, чтобы поток сделал что-то интересное,
тогда вы должны предоставить код (...
), чтобы сделать интересную вещь.
Как правило, оригинальный поток продолжает делать что-то еще одновременно с новым потоком:
Thread.new { ... }
do_something_else()
Параллельное выполнение операций (возможно, даже параллельно ) - это, в конце концов, смысл многопоточности.
Потоки взаимодействуют посредством доступа к общим объектам ... но одному потоку не имеет смысла смотреть на общий объект, пока он не узнает, что другой поток завершил его обновление. Самый простой способ - join()
другой поток.
t = Thread.new { ... }
do_something_else()
t.join() # this simply waits until the thread has finished.
Теперь об этих общих объектах. Это особенно легко в Ruby.
shared_object = Hash.new()
t = Thread.new {
shared_object["a"] = ...
shared_object["b"] = ...
...
}
do_something_else()
t.join()
# after the join() call returns, it's safe to look in shared_object
# to see what the other thread left for us.
do_something_with(shared_object["a"])
...
Существует еще одна проблема, которая возникает, если вам нужен основной поток для доступа к shared_object
одновременно с новым потоком (то есть, за до он вызывает t.join()
). Google для «условия гонки», или «блокировки», или «взаимного исключения», или « mutex » для получения дополнительной информации о том, почему это сложно, и как сделать это безопасно.