Thread Nedir?
Thread (iş parçacığı), bir programın yürütme yolu olarak tanımlanır. Her thread (iş parçacığı) benzersiz bir kontrol akışı tanımlar. Uygulamanız karmaşık ve zaman alıcı işlemler içeriyorsa, her bir iş parçacığının belirli bir işi yerine getirdiği farklı yürütme yolları veya iş parçacıkları ayarlamak genellikle yararlı olur.
Thread kullanımının yaygın bir örneği, modern işletim sistemleri tarafından eşzamanlı programlamanın uygulanmasıdır. Thread kullanımı, CPU döngüsü israfını azaltır ve bir uygulamanın verimliliğini artırır.
Şimdiye kadar tek bir iş parçacığının, uygulamanın çalışan örneği olan tek bir işlem olarak çalıştığı programları yazdık. Ancak, bu şekilde uygulama bir seferde bir iş gerçekleştirebilir. Aynı anda birden fazla görevi yürütmesini sağlamak için daha küçük iş parçacıklarına bölünebilir.
Thread Life Cycle (Yaşam Döngüsü)
Thread (iş parçacığının) yaşam döngüsü, System.Threading.Thread sınıfından bir nesne oluşturulduğunda başlar ve iş parçacığı sonlandırıldığında veya yürütmeyi tamamladığında sona erer.
Thread (iş parçacığının) yaşam döngüsündeki çeşitli durumlar aşağıdadır.
The Unstarted State (Başlatılmamış Durum): Thread (iş parçacığı) örneğinin oluşturulduğu ancak Start metodunun çağrılmadığı durumdur.
The Ready State (Hazır Durum): Thread (iş parçacığının) çalışmaya hazır olduğu ve CPU döngüsünü beklediği durumdur.
The Not Runnable State (Çalıştırılamaz Durum): Thread (iş parçacığı) çalıştırılamaz, ne zaman
- Sleep metot çağrıldığında.
- Wait metot çağrıldığında.
- I/O Operasyonları engellediğinde.
The Dead State: Thread (iş parçacığının) yürütmeyi tamamladığı veya iptal edildiği durumdur.
Main Thread – C#
C#’ta Main metodu, herhangi bir konsol uygulamasının giriş noktasıdır. Bir C# programını çalıştırdığınızda yürütülen ilk metoddur.
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
Main metodu, C# dilinin gerektirdiği belirli bir imzaya sahiptir. Void döndüren statik bir metot olmalıdır ve parametresi olarak, genellikle uygulamaya komut satırı argümanlarını iletmek için kullanılan bir string dizi alabilir.
Bir command-line argümanları alan main metot örneği:
internal class Program
{
private static void Main(string[] args)
{
if (args.Length > 0)
{
Console.WriteLine("İlk argüman: {0}", args[0]);
}
else
{
Console.WriteLine("Hiç bir argüman iletilmedi.");
}
}
}
Sonuç:
Hiç bir argüman iletilmedi.
Bu örnekte, uygulamaya herhangi bir komut satırı argümanının aktarılıp aktarılmadığını kontrol ediyoruz ve string interpolation kullanarak ilk argümanı konsola yazdırıyoruz. Hiçbir argüman iletilmemişse, bunu belirten bir mesaj yazdırıyoruz.
C#, multithreaded (çok iş parçacıklı) programlama için yerleşik destek sağlar. Multithreaded (çok iş parçacıklı) bir program, aynı anda çalışabilen iki veya daha fazla parça içerir. Böyle bir programın her parçasına thread (iş parçacığı) denir ve her thread (iş parçacığı) ayrı bir yürütme yolu tanımlar.
Main Thread
Bir C# programı başladığında, bir thread (iş parçacığı) hemen çalışmaya başlar. Buna genellikle programımızın ana thread’i denir.
Özellikleri:
Altında diğer “alt” thread (iş parçacıklarının) oluşturulacağı thrad’dır (iş parçacığıdır).
Çoğu zaman, çeşitli kapatma eylemleri gerçekleştirdiğinden yürütmeyi bitiren son thread (iş parçacığı) olmalıdır.
internal class Program
{
//Main Thread
private static void Main(string[] args)
{
Console.WriteLine("Merhaba Main Thread");
//Child (Alt) Treads
Thread threadA = new Thread(childthread);
Thread threadB = new Thread(childthread);
threadA.Start();
threadB.Start();
}
public static void childthread()
{
Console.WriteLine("Merhaba Child thread");
}
}
Sonuç:
Merhaba Main Thread
Merhaba Child thread
Merhaba Child thread
Açıklama: Yukarıdaki program, main thread olarak bilinen yalnızca bir thread’dan oluşur. Main thread tıpkı diğer thread’ler gibi çalışır ancak otomatik olarak başlar, main thread’ın yürütülmesini başlatmak için herhangi bir Start() metoduna ihtiyacınız yoktur. Hem threadA hem de threadB, main thread’ın alt thread’ıdır. İlk main thread çalışır sonra alt thread’lar çalışmaya başlar.
Main Thread’e Nasıl Erişilir?
Main thread (iş parçacığına) erişmek için Thread sınıfı nesnesine ihtiyacınız vardır. Bunu, Thread sınıfının CurrentThread özelliğini kullanarak oluşturabilirsiniz. Başvuruyu, kullanıldığı thread (iş parçacığına) döndürür. Böylece, main thread içinde CurrentThread özelliğini kullandığınızda, main thread’in referansını alırsınız. Bundan sonra, tıpkı başka bir thread (iş parçacığı) gibi ana iş parçacığı üzerinde kontrol sahibi olacaksınız.
internal class Program
{
//Main Thread
private static void Main(string[] args)
{
Thread thread;
//main thread'in referansını alın.
//CurrentThread özelliğini kullanma.
thread = Thread.CurrentThread;
//Main Thread'ın adını göster.
if (thread.Name == null)
{
Console.WriteLine("Main Thread'in adı yok.");
}
else
{
Console.WriteLine("Main Thread: {0}", thread.Name);
}
thread.Name = "Main";
Console.WriteLine();
//Main thread'ın önceliğini göster.
Console.WriteLine("Main öncelik" + " thread: {0}", thread.Priority);
//Main thread'ın adını göster.
Console.WriteLine("Main Thread: {0}", thread.Name);
}
}
Sonuç:
Main Thread'in adı yok.
Main öncelik thread: Normal
Main Thread: Main
Thread Tipleri
C#’ta iki tip thread (iş parçacığı) vardır: Foreground Thread ve Background Thread.
Foreground Thread
Main thread sürecinden ayrılsa bile işini tamamlamak için çalışmaya devam eden bir thread (iş parçacığı), bu tip thread foreground thread olarak bilinir. Foreground thread, main thread’ın canlı olup olmamasıyla ilgilenmez, ancak atandığı işi bitirdiğinde tamamlanır. Veya başka bir deyişle, Foreground thread’ın ömrü main thread’a bağlı değildir.
Örnek:
using System.Runtime.InteropServices;
internal class Program
{
//Main Thread
private static void Main(string[] args)
{
//Thread oluşturma.
Thread thread = new Thread(mythread);
thread.Start();
Console.WriteLine("Main Thread Bitti");
}
//Static metod.
static void mythread()
{
for (int c = 0; c <= 3; c++)
{
Console.WriteLine("mythread progress işlemi devam ediyor!!");
Thread.Sleep(1000);
}
Console.WriteLine("mythread progress işlemi bitti!!");
}
}
Sonuç:
Main Thread Bitti
mythread progress işlemi devam ediyor!!
mythread progress işlemi devam ediyor!!
mythread progress işlemi devam ediyor!!
mythread progress işlemi devam ediyor!!
mythread progress işlemi bitti!!
Yukarıdaki örnekte, main thread sona erdikten sonra diğer thread çalışır. Bu nedenle, thread’ın ömrü main thread’ın ömrüne bağlı değildir. thread iş parçacığı, yalnızca atanan görevi tamamladığında sürecini sonlandırır.
Background Thread
Background Thread’ın ömrü, main thread’ın ömrüne bağlıdır. Main thread işlemini bitirirse, background thread da işlemini bitirir.
Not: Programınızda bir arka plan iş parçacığı kullanmak istiyorsanız, iş parçacığının IsBackground özelliğinin değerini true olarak ayarlayın.
using System.Runtime.InteropServices;
internal class Program
{
//Main Thread
private static void Main(string[] args)
{
//Thread oluşturma.
Thread thread = new Thread(mythread);
thread.Start();
//Background Thread özelliğini aktif etme.
thread.IsBackground = true;
Console.WriteLine("Main Thread Bitti");
}
//Static metod.
static void mythread()
{
Console.WriteLine("mythread progress işlemi devam ediyor!!");
Thread.Sleep(2000);
Console.WriteLine("mythread progress işlemi bitti!!");
}
}
Sonuç:
mythread progress işlemi devam ediyor!!
Main Thread Bitti
Yukarıdaki örnekte, IsBackground değerinin true olarak ayarlandığını ve Background Thread özelliğinin kullanıldığını görürsünüz. IsBackground değerini false olarak ayarlarsanız, verilen thread bir Foreground thread gibi davranır. Şimdi, main thread işlemi bittiğinde diğer thread’ın işlemi sona erer.