Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# 4.0 ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство - 2011Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 208

Автор Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚ Π¨ΠΈΠ»Π΄Ρ‚

public MyThread(string name) {

Count = 0;

Thrd = new Thread(this.Run);

Thrd.Name = name;

Thrd.Start() ;

}

// Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ, void Run()    {

Console.WriteLine(Thrd.Name + " Π½Π°Ρ‡Π°Ρ‚."); do {

Thread.Sleep (500);

Console.WriteLine("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + Thrd.Name + ", Count = " + Count); Count++;

} while(Count < 10);

Console.WriteLine(Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");

}

}

class MoreThreads { static void Main() {

Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.");

// Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ    Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

do {

Console.Write(".");

Thread.Sleep(100) ;

} while (mtl.Count <10 I | mt2.Count <10 || mt3.Count < 10);

Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");

}

}

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.

.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π½Π°Ρ‡Π°Ρ‚.

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π½Π°Ρ‡Π°Ρ‚.

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 Π½Π°Ρ‡Π°Ρ‚.

....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 0 Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 0 Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 0

.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 1

ΠŸΠΎΡ‚ΠΎΠΊ #1 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 9 ΠŸΠΎΡ‚ΠΎΠΊ #2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 9 ΠŸΠΎΡ‚ΠΎΠΊ #3 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ всС Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π°Ρ‡Π½ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ЦП. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ срСды выполнСния, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ², Π²Π»ΠΈΡΡŽΡ‰ΠΈΡ… Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания ΠΏΠΎΡ‚ΠΎΠΊΠ°

НСрСдко оказываСтся ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊ. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для этой Ρ†Π΅Π»ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π»ΠΎΡΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Count. Но вСдь это Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈ Π½Π΅ совсСм ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠ΅ для обобщСния Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. ΠŸΡ€Π°Π²Π΄Π°, Π² классС Thread ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… срСдства для опрСдСлСния ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π‘ этой Ρ†Π΅Π»ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ доступноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния свойство Is Alive, опрСдСляСмоС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

public bool IsAlive { get; }

Бвойство IsAlive Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли ΠΏΠΎΡ‚ΠΎΠΊ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΎ вызываСтся, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ выполняСтся. Для "опробования" свойства IsAlive ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° вмСсто ΠΊΠΎΠ΄Π° Π² классС More Thread ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсии ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свойство IsAlive для отслСТивания ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², class MoreThreads { static void Main() {

Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.");

// Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ    Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

do {

Console.Write(".");

Thread.Sleep(100);

} while (mtl.Thrd.IsAlive && mt2.Thrd.IsAlive && mt3.Thrd.IsAlive);

Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");

}

}

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этой вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получаСтся Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ свойство IsAlive для отслСТивания ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ отслСТивания ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания состоит Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Join (). НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π΅Π³ΠΎ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ Ρ„ΠΎΡ€ΠΌΠ°.

public void Join()

ΠœΠ΅Ρ‚ΠΎΠ΄ Join () ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½, Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. Π•Π³ΠΎ имя ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ оТидания Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ присоСдинится ΠΊ Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ. Если ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±Ρ‹Π» Π½Π°Ρ‡Π°Ρ‚, Ρ‚ΠΎ гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ThreadStateException. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Join () ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ слСдуСт ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ Join () ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ послСдним.

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Join().

using System;

using System.Threading;

class MyThread { public int Count; public Thread Thrd;

public MyThread(string name) {

Count = 0;

Thrd = new Thread(this.Run);

Thrd.Name = name;

Thrd.Start ();

}

// Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ, void Run()    {

Console.WriteLine(Thrd.Name + " Π½Π°Ρ‡Π°Ρ‚."); do {

Thread.Sleep(500);

Console .WriteLine ("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + Thrd.Name + ", Count = " + Count);

Count++;

} Vhile(Count < 10);

Console.WriteLine(Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");

}

}

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Join() для оТидания Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€,

// ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ, class JoinThreads { static void Main() {

Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.");

// Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ    Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

mtl.Thrd.Join();

Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 присоСдинСн."); mt2.Thrd.Join();

Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 присоСдинСн."); mt3.Thrd.Join();

Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 присоСдинСн.");

Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");

}

}

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Напомним, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ срСды выполнСния, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ², Π²Π»ΠΈΡΡŽΡ‰ΠΈΡ… Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π½Π°Ρ‡Π°Ρ‚. β€’

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π½Π°Ρ‡Π°Ρ‚.

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 Π½Π°Ρ‡Π°Ρ‚.

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#3,

Count

=

3

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#1,

Count

=

4

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#2,

Count

=

4

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#3,

Count

=

4

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#1,

Count

=

5

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#2,

Count

=

5

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#3,

Count

=

5

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#1,

Count

=

6

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#2,

Count

=

6

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#3,

Count

=

6

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#1,

Count

=

7

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#2,

Count

=

7

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#3,

Count

=

7

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#1/

Count

=

8

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#2,

Count

=

8

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#3,

Count

=

8

Π²

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#1/

Count

=

9

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

Π’

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#2,

Count

=

9

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

Π’

ΠΏΠΎΡ‚ΠΎΠΊΠ΅

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ

#3,

Count

=

9

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 присоСдинСн.

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 присоСдинСн.

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 присоСдинСн.

Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ряда Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Join ().