Когда я использую потоки, чтобы напечатать вещи на консоль, почему это дает странные результаты?

В последнее время я увлекаюсь потоками, читая очень хороший PDF-файл Роба Майлза (Вот). У него был пример на странице 160 (2012, C # pdf), но это не так.T записать в консоль только что сделал пустые циклы.

Я написал очень простой цикл создания потоков, который создает 10 потоков, которые записывают свои идентификаторы на экран для каждого числа, кратного 1000. Это было хорошо - это показало мне, как потоки работали вместе. Мои вопросы начинаются с того, почему мой вывод так запутан? Часто, когда я запускаю программу ниже, я получаю несколькоТема 3 Закончена " линии, где яЯ уверен, у меня должен быть только один из них.

Я добавилзамок" из MSDN в цикл, но он все еще производит странный вывод (яприведу пример ниже).

    namespace ConsoleApplication1
    {
        class Program
        {
            static object sync = new object();

            static void Main(string[] args)
            {
                for (int i = 0; i < 10; i++)
                {
                    Thread myThread = new Thread(() => DoThis(i));
                    myThread.Start();
                }
                Console.ReadLine();
            }

            static void DoThis(int s)
            {
                lock (sync) // a new addition that hasn't helped
                {
                    for (long j = 0; j < 10000; j++)
                    {
                        if (j % 1000 == 0) Console.Write(String.Format("{0}.", s));
                    }
                    Console.WriteLine("\r\nThread {0} Finished", s);
                    Debug.Print("\r\nThread {0} Finished", s); //

Ответы на вопрос(2)

Ваш ответ на вопрос