Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

Как вызвать поток дважды поочерёдно?

Я новичок в этой теме, поэтому извините, если туплю. Пытаюсь разобраться.
Например, есть код:
namespace Practice
{
    internal class Program
    {

        static string output = "CHINA";
        static object locker = new object();
        static void Main(string[] args)
        {
            Thread th1 = new Thread(Print);
            Thread th2 = new Thread(Print);
            th1.Start();

            th1.Join();

            th1.Start();
        }
        static void Print()
        {
            lock (locker)
            {
                Console.WriteLine(output);
                output = output == "CHINA" ? "INDIA" : "CHINA";
            }
        }
    }
}

Вывод:
CHINA
Unhandled exception. System.Threading.ThreadStateException: Thread is running or terminated; it cannot restart.
at System.Threading.Thread.StartCore()
at Practice.Program.Main(String[] args) in C:\Users\bredu\Documents\Учёба\Саморазвитие\1. Навыки для работы\Programming Practice\Проекты\Маленькие\Threads. Pr. 19-21\Practice\Program.cs:line 16

Вот там, где я вызываю метод Join(), я хочу, типа, как-то то ли завершить поток, то ли показать компилятору, что поток завершился. Ну, я в итоге хочу, чтоб оно вывело:
"CHINA"
"INDIA"
используя один и тот же поток.

Прочитал я где-то, что, вроде, через Task с методом ContinueWIth() можно решить эту задачу, но мне интересно, как будет выглядеть решение этой задачи через функционал чисто для Threads.
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
@mvv-rus
Настоящий админ AD и ненастоящий программист
Поток повторно запустить нельзя. После th1.join() (этот вызов дожидается завершения потока) cоздайте новый поток, присвойте его нужной переменой - да хоть той же th1 - и запустите его: будет функциональный аналог Task.ContinueWith(). Или же запустите th2, который у вас уже создан, но не запущен.
Если вы хотите сделать два вызова Print в одном потоке - сделайте. Если между первым и вторым вызовом надо выполнить какой-нибудь код в основном потоке, то придется использовать объекты синхронизации, в данном случае - события, и ждать на них. Про это курите тему ManualResetEvent/AutoResetEvent, в двух словах в ответе всю эту тему не объяснить
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Используй join() для последовательного выполнения потоков.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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