Ana içeriğe atla

Java ile Thread Pool Kullanımı

Oluşturacağımız uygulama 100 x 100 boyutlu bir matrisin içerisinde arttırma işlemi yapacaktır.
Bu işlem için Runnable yada Callable sınıfı kullanılabilir. Runnable objesi olarak tanımladığımızda threadlerimiz sonlandırılana kadar sürekli olarak çalışacak ve kuyruğu sürekli olarak kontrol edip yeni bir görev olup olmadığına bakacaklardır. Thread class'ımız bize execute() adında bir method kullanım imkanı sağlamaktadır; execute(Runnable myR) şeklinde bir kullanım ile kuyruğa yeni Runnable objeler eklememize imkan sağlamaktadır.

ExecutorService bize asenkron olarak arka tarafta işleyen bir işletme mekanizması sağlamaktadır.
Öncelikle thread pools kullanmak için java.util.concurrent.Executors sınıfını kodumuza implemente etmemiz gerekiyor. Sonra newFixedThreadPool() kullanabilmek için ExecutorService kullanılmıştır. java.util.concurrent.ExecutorService kütüphanesini kodumuza implemente ederek kullanabiliyoruz. Ve bu kütüphane aracılığıyla execute() metoduna da ulaşabiliyoruz. Main methodumuz aşağıdaki gibi olacaktır:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.Executors;

public class Q1 {

 public static MiddleLevel myM=new MiddleLevel();

 private static final int NTHREADS = 10;

 public static void main(String[] args) {

 ExecutorService executor = Executors.newFixedThreadPool(NTHREADS);

 for(int i=0;i<100 data-blogger-escaped-i="++">
  executor.execute(myM);
 myM.PrintMatrix();
 executor.shutdown();
 try {
  executor.awaitTermination(1, TimeUnit.MILLISECONDS);  
 }
        catch (InterruptedException e) {
  e.printStackTrace();
 } 
    }
}

Yukarıda görüldüğü gibi öncelikle MiddleLevel adında bir classtan obje oluşturuyorum. MiddleLevel class'ı Runnable'a implemente edilmiştir. Daha sonra Thread pool'umun boyutunu 10 olarak belirliyorum.  execute() fonksiyonu ile de Runnable olan myM objem'in run() metodunu çağırıyorum. awaitTermination(long, TimeUnit.[HOURS,MILLISECONDS, MINUTES]) metodu ile tüm threadlerimin çalışması bitene kadar bekletmiş oluyorum. shutdown() metodunu threadlerin çalışmasını durdurmak için kullanıyorum ve bu methodu kullanmayı asla unutmuyorum. MiddleLevel class'ım aşağıdaki gibidir:

public class MiddleLevel implements Runnable {

 Matrix myMatrix = new Matrix(100,100);

 @Override
 public void run() {
  myMatrix.increment();  
 }

 public void PrintMatrix()
 {
  System.out.println(myMatrix.toString());
 }
}

Matrix class'ım iki adet parametre istemektedir; bunlar satır ve sütun boyutlarım. Ayrıca içerisinde matrisin içeriğini 1 değer arttıran increment() methodu bulunmaktadır. Kullanılan Matrix sınıfı ve içeriği aşağıdaki gibidir:

public class Matrix{

     private int rows;
     private int cols;
     private int[][] array;

     public Matrix(int rows, int cols) {

           this.rows = rows;
           this.cols = cols;
           array = new int[rows][rows];
     }

     public void increment(){

           for(int i=0;i<rows;i++)
                for(int j=0;j<cols;j++)
                     array[i][j]++;
}

     @Override
     public String toString() {

           StringBuffer s=new StringBuffer();
           int rowSum;

           for(int i=0;i<rows;i++){
                rowSum=0;

                for(int j=0;j<cols;j++)
                     rowSum+=array[i][j];
                s.append(rowSum);
                s.append(" ");
           }
           return s.toString();
     }
}

Thread Senkronizasyonu
Paylaşılan bir kaynak yada method'a aynı anda birden çok Thread erişmeye çalışabilir bu durumu önlemek için thread bloğumuzu senkronize ediyoruz. Önceki yazıda MiddleLevel olarak geçen class'ımızın ismi Wrapper olarak değiştirilmiştir. Böylece class'ımızın son hali aşağıdaki gibi olacaktır:
public class Wrapper implements Runnable {

 Matrix myMatrix = new Matrix(100,100);

 @Override
 public synchronized void run() {
  myMatrix.increment();
 }

 public void PrintMatrix()
 {
  System.out.println(myMatrix.toString());
 }
}

Kaynak: http://www.vogella.com/tutorials/JavaConcurrency/article.html

Yorumlar

Bu blogdaki popüler yayınlar

Adım Adım Weka Kullanımı

WEKA bir veri madenciliği uygulamasıdır ve Yeni Zellanda'daki Waikato Üniversitesi tarafından geliştirilmektedir. Bu yazının amacı WEKA Explorer'ı kullanmayı öğretmektir.

Weka ile Sınıflandırma

"Preprocessing" aşamasında veri setimizi yükledik ve eğer gerekliyse ön aşamadan geçirdikten sonra sınıflandırma aşamasına geçebiliriz. Weka nedir, Ön İşlem bölümünde neler yapılır sorusunun cevapları için önce bu yazımı okumalısınız. SINIFLANDIRMA Verimizi ön işlemden geçirdikten sonra artık sınıflandırabiliriz. WEKA'yı kullanarak bir çok sınıflandırıcıyı kullanabilirsiniz; Karar Ağaçları, SVM, Multi-layer Perceptrons vs. Veri setinizi yükledikten sonra  Classify  bölümüne tıklayarak sınıflandırma sayfasına erişebilirsiniz. Ön tanımlı ayarlara göre  ZeroR   algoritması gelmektedir. Bu algoritmanın başarımı çok düşük olduğu için ben " Iris " veri seti için iyi sonuç verdiği bilinen J48 algoritması ile devam edeceğim:

Chosen - Ciphertext Attack

Chosen-Ciphertext Attack'ı Türkçeye Seçilmiş Şifreli Metin Saldırısı olarak çevirebiliriz. Bu yöntem ile bir saldırgan seçtiği şifreli metinlerin bilinmeyen bir anahtar altında çözümlerine bakarak anahtarı bulmaya yönelik olarak çalışır. Bu yöntemde saldırganın düşman sisteme bir veya daha fazla ciphertext'i(şifreli metin) vererek plaintextleri(düz metin) elde etme şansı vardır. Bu bilgiler sayesinde saldırganın bilinmeyen şifreyi elde edebilme olasılığı yüksektir. Örnek olarak El Gamal kripto sistemi semantik olarak güvenli bir sistemdir. Seçilmiş düz metin saldırısı (Chosen plaintext attack) ile elde edilemez ancak seçilmiş şifreli metin saldırısı ile kolaylıkla alt edilebilir. Başka bir örnekte SSL protokolünde kullanılan eski RSA kripto sistemi Uyarlanır Seçilmiş Şifreli Metin Saldırısı (Adaptive Chosen Ciphertext Attack) ile SSL Session key'i ortaya çıkarıyordu.  Seçilmiş Şifreli Metin Saldırı Yöntemini nasıl kullanabileceğimize gelince Alice ve Bob'un mesajlaşt