Ожидание Join в C#
Метод Join блокирует текущий поток, пока целевой Thread не завершит выполнение делегата. Так главный поток дожидается результата второго потока в общем поле.
Повторный Join на уже завершённом потоке возвращается сразу. Join не возвращает значение, а только синхронизирует по времени. Само число передают через общую переменную.
Поток запишет в shared число 3, главный дождётся его конца и прочитает итог. Без ожидания Console.WriteLine мог бы выполниться раньше присвоения и вывести 0:
int shared = 0;
Thread w = new(() => shared = 3);
w.Start();
w.Join();
Console.WriteLine(shared); // выведет 3
Запустите поток, который записывает в общее поле строку "done". Дождитесь завершения потока и выведите это поле.