Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2014, 21:12   #1
Jeckor
Пользователь
 
Регистрация: 27.10.2013
Сообщений: 22
Сообщение Многопоточность (по Шилдту)

Здравствуйте! У меня вопрос: в чем смысл строки кода if(currentName != Thrd.Name) в методе Run() класса MyThread? Через конструктор класса MyThread мы передаем параметр name, который присваивается как Thrd.Name, так и currentName. Зачем же сравнивать их в блоке if, если они уже одинаковы? Причем, во время выполнения программы строка в блоке if "Console.WriteLine("В потоке " + currentName);" таки выводится, но как? Каким образом проверка if(currentName != Thrd.Name) достигает значения true, если они с самого начала равны одному и тому же значению? Заранее спасибо.

Код:
using System;
using System.Threading;

class MyThread
{
    public int Count;
    public Thread Thrd;
    static bool stop = false;
    static string currentName;
    /* Сконструировать новый поток. Обратите внимание на то, что
    данный конструктор еще не начинает выполнение потоков. */
    public MyThread(string name)
    {
        Count = 0;
        Thrd = new Thread(this.Run);
        Thrd.Name = name;
        currentName = name;
    }
    // Начать выполнение нового потока.
    void Run() 
    {
        Console.WriteLine("Поток " + Thrd.Name + " начат.");
        do {
            Count++;
            if(currentName != Thrd.Name)
            {
                currentName = Thrd.Name;
                Console.WriteLine("В потоке " + currentName);
            }
        } while(stop == false && Count < 1000000000);
        stop = true;
        Console.WriteLine("Поток " + Thrd.Name + " завершен.");
    }
}
class PriorityDemo
{
    static void Main()
    {
        MyThread mt1 = new MyThread("с высоким приоритетом");
        MyThread mt2 = new MyThread("с низким приоритетом");
        // Установить приоритеты для потоков.
        mt1.Thrd.Priority = ThreadPriority.AboveNormal;
        mt2.Thrd.Priority = ThreadPriority.BelowNormal;
        // Начать потоки.
        mt1.Thrd.Start();
        mt2.Thrd.Start();
        mt1.Thrd.Join();
        mt2.Thrd.Join();
        Console.WriteLine();
        Console.WriteLine("Поток " + mt1.Thrd.Name + " досчитал до " + mt1.Count);
        Console.WriteLine("Поток " + mt2.Thrd.Name +
        " досчитал до " + mt2.Count);
    }
}
Jeckor вне форума Ответить с цитированием
Старый 21.05.2014, 00:31   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Код:
if(currentName != Thrd.Name)
Это проверка для того чтобы оповестить тебя о том какой поток сейчас выполняется.
Имена потоков в итоге делают одинаковыми для того чтобы выводить сообщение не больше одного раза.
Если ты запустишь через некоторое время еще один или более новых потоков с промежуточным интервалом ты увидишь в чем разница.

п.с. В MyThread currentName не нужно присваивать для того чтобы условие внутри потока выполнилось хотя бы один раз.

Последний раз редактировалось coNsept; 21.05.2014 в 00:34.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изучение С++ с нуля, по Шилдту Г. WizzardFox Помощь студентам 3 02.04.2014 20:43
Многопоточность lalilulelo Операционные системы общие вопросы 20 16.04.2012 19:33
Многопоточность nats C# (си шарп) 5 25.06.2011 11:51
Многопоточность boo_mago Общие вопросы C/C++ 7 21.03.2011 21:23
Многопоточность Dezmont_ Общие вопросы .NET 1 06.11.2010 18:34