14 Haziran 2019 Cuma

Thread ve Multithreading Nedir?

Hepinizin bildiği üzere işletim sistemlerinde uygulamaların çalışmasını sağlayan process(işlem)ler vardır. Bunlar uygulamaları izole ederek çalışan diğer uygulamalarla beraber birbirlerinin verilerini bozmamasını sağlayarak her uygulamalanın kendi memori adreslerinde çalışmasını sağlarlar. Bu uygulamaların CPU ya bakan tarafına geldiğimizde ise bunun için ayrı bir kavram devreye giriyor ve bu kavrama da Thread diyoruz.
Thread ler dillerin kendi  yapılarından gelen bir şey değil, işletim sistemlerinin yapısından gelen bir durumdur. İşletim sistemlerinin birden fazla uygulamayı aynı anda çalıştırabilmek için geliştirilmiş bir yaklaşımdır. Thread mantığı olmasaydı aynı anda birden çok uygulama yada program kullanılamaz olur ve diğer uygulama yada program kullanabilmek için mevcut çalışanı sonlandırmamız gerekirdi. Umarım bu kısa giriş Thread kavramını anlayabilmek için yeterli olmuştur.


Not: Anlatım ve örnekleri C# üzerinden gerçekleştiriyorum fakat genel olarak diğer dillerde de mantık hemen hemen aynıdır. Önemli olan meseleyi anlamak 

Thread Priority
Bazı durumlarda bir Thread’e öncelik vermek isteyebiliriz. Bu durumda öncelikli işlemyapmasını istediğimiz Thread’e Thread.Priority özelliğini vermeliyiz.

       Thread a = new Thread(()=>{
             Console.WriteLine("İkinci Thread");
       });   
             Thread b = new Thread(()=>{
             Console.WriteLine("Birinci Thread");
       });   
       b.Priority = ThreadPriority.Normal;
       a.Start();
       b.Start();

Thread.Sleep
Başlatılacak Thread işleminin uygulama çalıştırıldıktan belli bir zaman sonra çalışmasını istiyorsan Thread.Sleep  özelliğini kullanabiliriz.
Mesela uygulama çalıştıktan 2sn sonra çalışmasını istediğimiz bir Thread için Thread.Sleep(2000); şeklinde bir komut vermeliyiz.


       Thread a = new Thread(()=>{
             Thread.Sleep(2000);
             Console.WriteLine("İkinci");
       });   
       a.Start();


Thread.Join
Birbirini beklemesi gerek Thread işlemlerinde Thread.Join kullanılır. Böylece bir önceki iş bitmeden diğer işleme geçiş yapılması engellenir. Aşağıda ki örnekte a işlemi 2sn sonra başlatılıyor ve bu işlem bitmeden b işlemine geçilmiyor.

               Thread a = new Thread(()=>{
                              Thread.Sleep(2000);
                              Console.WriteLine("ilk işlem");
               });          
                              Thread b = new Thread(()=>{
                              Console.WriteLine("Bekletilen işlem");
               });          
               a.Start();
               a.Join();
               b.Start();



Şimdilik bu kadar. Thread konusuna devam etmeyi ve özellikle Thread Locks ve ThreadPools kavramları üzerinde durduğum bir yazı yasmak istiyorum. Umarım burada ki bilgiler işinize yaramıştır.