Programlarda belli ihtiyaçlara göre aynı anda birden fazla işi execute etmek gerekebilir ancak normal şartlarda yazılım dilleri satır satır çalıştığından bir satırın çalışması tamamlanmadan bir diğer satıra geçemez. Bu gibi durumlarda devreye multithreading kavramı girer.
Multithreading thread bir program içinde eşzamanlı çalışabilen kod parçacıklarını tanımlamamıza yarar ve threadeler genelde aynı kaynağı kullanır ve programda çakışma ihtimalleri vardır.
Multithreading ve Multitasking arasındaki fark
multitasking birden fazla işlemin aynı anda işlenmesi, multithreading ise bir işlemdeki birden fazla iş parçacığının aynı anda işlenmesidir.
Thread Tanımlama
Basit tabiriyle threadleri işçiler gibi düşünebilirsiniz. Her bir thread belli işleri yüklenen işçiler gibidir.
Aşağıdaki örnek kodda bir thread tanımlanıp aynı class içerisinde yer alan say metodunu çalıştırma işlemi bu thread’e verilmiştir. Programın çalışma zamanı sırasında threadın start edildiği satıra gelindiğinde anathreade paralel bir thread daha oluşturulup programın geri kalanına paralel Say() fonksiyonu çalışacaktır.
class Program { static void Main(string[] args) { Program ProgramNesnesi = new Program(); //yeni bir thread ve thread start edildiğinde çalışacak işi tanımlar. Thread thread1 = new Thread(new ThreadStart(ProgramNesnesi.Say)); //threadi başlatır. thread1.Start(); for (int i = 0; i < 1000; i++) { Console.WriteLine("ana thread " + i); } Console.ReadKey(); } public void Say() { for (int i = 0; i < 1000; i++) { Console.WriteLine("thread 1 " + i); } } }
Bir thread tanımladığımızda içeriği yukarıdaki gibi olacaktır. Buradan önemli olanlarına kısaca değinmek gerekirse
IsAlive : Threading yaşar durumda olup olmadığını belirtir.
Name : Threadleri daha rahat monitor etmek için onlara isimler verebiliriz.
Priority : Threading eşzamanlı çalışan kod parçacıkları arasındaki önceliğini belirtir.
ThreadState : Threading o anki durumunu belirtir. (Unstarted,started,running vs)
Eğer parametreli bir metoda thread belirlemek istersek..
Thread count = new Thread( o => { count((string)o); }); count.Start("parameter"); private void count(string path) { ...... }
veya
var thread = new Thread(() => count("parameter"));
Thread Priority
Bazı durumlarda çoklu thread kullanırken öncelik vermek istenen iş parçacıkları olabilir. Birçok thread aynı anda start edildiğinde, bunlardan bir tanesi diğerlerine göre öncelikli olması gerekebilir. Bu gibi durumlarda imdadımıza yetişen Thread.Priority özelliğidir. Bu özellik bir enumerasyon tipindedir. Bu enum tipi, bünyesinde; Highest, AboveNormal, Normal, BelowNormal, Lovest gibi seçenekleri tutmaktadır. Bir threadin prioritysinin bir diğer threadten yüksek olması o threadin diğer threadden önce sonlanacağı yani daha önce elindeki işi tamamlayacağı anlamına gelmektedir.
//yeni bir thread ve thread start edildiğinde çalışacak işi tanımlar. Thread thread1 = new Thread(new ThreadStart(ProgramNesnesi.Say)); //Thread'e öncelik atar thread01.Priority = ThreadPriority.Highest; //threadi başlatır. thread1.Start();
Thread Metotları
1.Abort() metodu
Abort metodu ile de threadi iptal edebiliriz.
2.Sleep() Metodu
Aslında bizlere fazla yabancı olmayan Sleep metodu, teknik olarak aldığı milisaniye cinsinden değer kadar threadı durdurmamızı sağlayan static bir metottur.
3.Suspend() ve Resume() Metodu
Suspend metodu ile Thread geçici olarak durdurulabilir. Suspend ile geçici olarak durdurulmuş Thread Resume metodu ile kaldığı yerden devam ettirilebilir.
4.Join() Metodu
Düşünün ki, bir threadı sonlandırmak istiyorsunuz ama ilgili thread içerisinde kullanılan diğer threadların son bulması şartıyla…
Lock Deyimi
Multi Thread programlamada Thread’lerin senkronize bir şekilde çalışmasını lock ifadesiyle sağlarız. Yani lock ifadesinin kullanım amacı bir kaynağa 1 den fazla Threadin aynı anda erişmesini engellemektir.Örnek vermek gerekirse, bir thread bir dosyaya bir şey yazarken, diğer threadin yazma işlemi bitmeden bu kaynaktan veri okumasını engellemektir.