Bu Sayfayı Paylaş:

Bilgi/Açıklama

Thread

Bir program, kodları satır satır yürütür. Bir satır bitmeden öbür satıra geçmez. Örneğin bir satırda uzun bir işlem olduğunu düşünelim. Bu uzun işlem bitmeden bir sonraki satıra geçilemeyeceği için program bekleme durumuna girer. İşlem bitene kadar program içinde başka bir işlem gerçekleşemez. Bu tür işlemlerde Thread kullanılabilir. Thread (İplik) aynı anda birden çok kodun çalışabilmesi amacıyla kullanılmaktadır.
Java'da bir Thread yaratmak için Thread sınıfı kullanılmaktadır. Bu sınıf kurucusunda Runnable (Çalıştırılabilir) interface'ni istemektedir. Thread çalışmaya başladığı zaman Runnable'ın run() (çalış) yöntemini çağıracaktır. Aşağıdaki gibi bir örnek yapılabilir:
// Bir thread yaratılacak.
public class ThreadTest implements Runnable{
  ThreadTest(){
    // Bir thread yaratılıyor ve 
    // kurucuda ThreadTest veriliyor.
    Thread t=new Thread(this);
    t.start();
    System.out.println("Thread Başlatıldı");
  }    
  // Thread çalıştığı zaman 
  // run yöntemi çağrılacak.
  public void run(){
    System.out.println("Thread Çalıştı");
  }    
  public static void main(String[] args){
    ThreadTest t=new ThreadTest();
  }
}
Yukarıdaki örnekte bir Thread yaratılmıştır. ThreadTest kurucusu içinde Thread nesnesi yaratılıp start() (başlat) ile başlatılır. Burada start() yöntemi ayrı bir süreç başlatır ve normal akış bir sonraki satıra geçer ve ekranda "Thread Başlatıldı" yazısı gözükür. Örnekte start() yöntemi run() yönteminin çalışmasına sebep olur ve ekranda "Thread Çalıştı" yazısı gözükür. ThreadTest sınıfı Runnable'ı implement etmiştir. Bu nedenle Thread sınıfının kurucusunda this ile kendisi verilir.
Bir Thread'in devamlı çalışması sağlanabilir. Bunun için sonsuz döngü açılabilir.
import java.util.*;
public class RepeaterThreadTest 
  implements  Runnable 
{
  public RepeaterThreadTest(){
    Thread t=new Thread(this);
    t.start();
    System.out.println("Thread Başlatıldı");        
  }    
  public void run() {
    // while(true) ifadesi ile 
    // thread devamlı çalışması sağlanmaktadır.
    while(true){
      try{
        // içinde bulunan thread
        // 1 saniye bekletilmektedir.
        Thread.sleep(1000);                
        System.out.println(
            "Thread: "+new Date());
      }catch(Exception e){
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args){
    RepeaterThreadTest t
        =new RepeaterThreadTest();
  }
}
Programın çıktısı aşağıdaki gibi olacaktır. Program durdurulmazsa sürekli devam eder.
Thread Başlatıldı
Thread: Tue Oct 25 18:34:01 EEST 2016
Thread: Tue Oct 25 18:34:02 EEST 2016
Thread: Tue Oct 25 18:34:03 EEST 2016
Thread: Tue Oct 25 18:34:04 EEST 2016
Thread: Tue Oct 25 18:34:05 EEST 2016
Thread: Tue Oct 25 18:34:06 EEST 2016
Örnekte while(true) ifadesi sonsuz döngüye girilmesini sağlar. Thread sınıfından çağrılan sleep() (uyu) yöntemi ise ise 1000 milisaniye (1 saniye) beklemeye neden olur. Sonuç olarak her bir saniyede ekrana tarihi basan bir Thread çalışır. Bu Thread durmaz. Programı sonlandırmanız gerekir veya Thread'in stop() yöntemini çağırmanız gerekir. Ancak bu yöntem eskimiş (deprecated) durumdadır. Önerilen, döngünden çıkarak doğal olarak Thread'in sonlandırılmasıdır.
Bir programda aynı anda birden fazla Thread çalıştırabilirsiniz.
// Birden fazla Thread yaratılabilir.
import java.util.*;
public class MultiThreadTest 
  implements Runnable
{
  Thread t1,t2;
  public MultiThreadTest(){
    t1=new Thread(this);
    t2=new Thread(this);        
    t1.start();   
    t2.start();
  }    
  public void run(){
    while(true){
      try{
        Thread.sleep(1000);
        // Hangi Thread'in 
        // çalıştığı anlaşılabilir.
        if(Thread.currentThread()==t1){
          System.out.println(
            "thread 1 "+new Date());
        }else if(Thread.currentThread()==t2){
           System.out.println(
              "thread 2 "+new Date());
        }
      }catch(Exception e){
        e.printStackTrace();}
      } 
  }
  public static void main(String[] args){
    MultiThreadTest mt=new MultiThreadTest();
  }
}
Programın çıktısı aşağıdaki gibidir.
thread 1 Tue Oct 25 18:38:59 EEST 2016
thread 2 Tue Oct 25 18:38:59 EEST 2016
thread 1 Tue Oct 25 18:39:00 EEST 2016
thread 2 Tue Oct 25 18:39:00 EEST 2016
thread 1 Tue Oct 25 18:39:01 EEST 2016
thread 2 Tue Oct 25 18:39:01 EEST 2016
thread 1 Tue Oct 25 18:39:02 EEST 2016
thread 2 Tue Oct 25 18:39:02 EEST 2016

Yukarıda iki Thread aynı ayna çalışmaktadır. İki Thread'te aynı run yönteminden geçmektedir. Thread sınıfındaki currentThread() (şimdiki iplik) ile şu anda hangi Thread içinde bulunulduğu anlaşılmaktadır.

Bilgi/Açıklama

Socket

Başka bilgisayarlara hizmet eden bilgisayarlarda belirli port (kapı) numaraları belirli görevler için ayrılmıştır. Örneğin 80 port numarası HTTP protokolüne ayrılmıştır. Yukarıdaki URLConnection sınıfı 80 portu üzerinden bağlanmaktadır.
Socket programlamada bir sunucu (server) ve birden fazla istemci (client) olabilir. Sunucu socket'i dinler ve kurulan socket'lere cevap verir. İstemci ise sunucuya socket açar ve bilgi alışverişinde bulunur.
Aşağıda 5555 portunu dinleyen bir sunucu uygulaması ve bu porta bağlanan bir istemci örneği yapılmıştır. Client sunucuya selam gönderecek ve selam alacaktır. Bir socket açılır ve sonra program sonlanır.
 
// 5555 portunu dinleyen 
// bir server örneği
import java.net.*;
import java.io.*;
public class SocketServerTest {
  public static void main(String[] args){
    try{
      //5555 portunu dinleyen bir 
      // ServerSocket yaratıyoruz.
      ServerSocket ss=new ServerSocket(5555);   
      System.out.println("bekleniyor..");
      // Socket açıldığı zaman 
      // accept yöntemi çalışır.
      Socket s=ss.accept();
      System.out.println("socket açıldı.");
      InputStream is=s.getInputStream();
      InputStreamReader isr
          = new InputStreamReader(is);
      BufferedReader input 
          = new BufferedReader(isr);
      OutputStream os=s.getOutputStream();
      PrintStream output = new PrintStream(os);        
      String message = input.readLine();
      System.out.println(
          "Client mesajı: " + message);
      output.println("Merhaba Client");
      s.close();
    }catch (Exception e){
      e.printStackTrace();
    }
  }
}
Bu 5555 portuna bağlanan socket'leri dinleyen bir sunucu uygulamasıdır. ServerSocket (Sunucu Prizi) sınıfının accept() (ona) yöntemi sunucuda socket açılıp açılmadığını dinler. Açıldığı zaman size bir socket nesnesi gönderir. Artık bu nesne ile socket açan client ile iletişim kurabilirsiniz. Aynı socket nesnesi ile veri alabilir ve veri gönderebilirsiniz. Socket açıldıktan sonra getInputStream() (girdi akımını edin) ile veri okuma ve getOutputStream() (çıktı akımını edin) ile verilen stream ile veri yazma gerçekleştirebilirsiniz. Yukarıdaki sunucu kodunda istemciden gelen mesaj okunmuş ve istemciye cevap olarak "Merhaba Client" gönderilmiştir. Uygulama çalıştığında aşağıdaki bekleniyor mesajı yazıp bir socket açılmasını bekleyecektir.
bekleniyor..
İstemci kodu aşağıdaki gibidir.
// Server’a 5555 port'undan 
// bağlanan client örneği.
import java.net.*;
import java.io.*;
class SocketClientTest{   
  public static void main(String[] args){
    try{
      Socket s=new Socket("localhost",5555);        
      InputStream is=s.getInputStream();
      InputStreamReader isr
          = new InputStreamReader(is);
      BufferedReader input 
          = new BufferedReader(isr);
      OutputStream os=s.getOutputStream();
      PrintStream output = new PrintStream(os);
      output.println("Selam Server");
      String response = input.readLine();
    System.out.println(
        "Servet Gönderdiği Mesaj: " 
            + response);
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}
İstemci ise bir socket nesnesi yaratır. Biz örnek olarak localhost kullandık. Ancak burası herhangi bir sunucu adı olabilir. Socket açtıktan sonra getInputStream() ile okuma ve getOutputStream() ile yazma gerçekleşebilir. Sunucuya "Selam Server" gönderilmekte ve sunucudan gelen mesaj ekrana basılmaktadır.
Sunucu çalıştırılıp, İstemci de çalıştırılırsa sunucuda aşağıdaki çıktı oluşur.
bekleniyor..
socket açıldı.
Client mesajı: Selam Server
Client'ta ise 
Servet Gönderdiği Mesaj: Merhaba Client

şeklinde bir çıktı oluşur.



Bu Sayfayı Paylaş:

İletişim/Bize Yazın   mh@fibiler.com   Google+   Facebook   Twitter   fibiler@googlegroups.com
Her Hakkı Saklıdır
Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir.
Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir