Bilindiği üzere Java’da Thread yapısını kullanmak için Runnable veya Thread sınıflarını extend ederek oluşturduğumuz sınıfımızın “run” metodunu dolduruyorduk. Misal Runnable’dan extend ederek oluşturduğumuz sınımızı Thread kullanarak çalıştırmak için new Thread(runnable).start() komutunu kullanıyoruz. Burada runnable nesnemizin “run” metodunda ne yazdıysak onu çalıştırmış olduk. Java 5.0 ile gelen yeni bir özellik ile Thread kullanımını farklı bir şekilde gerçekleştirmemiz artık mümkün.ExecutorService ve Executors sınıflarını kullanarak oluşturduğumuz Thread havuzlarını kullanarak daha efektif şekilde kod yazabiliriz. [java]ExecutorService threadPool = Executors.newFixedThreadPool(10);[/java] şeklinde oluşturduğumuz threadPool nesnesi bize gerektiğinde sayısı 20’ye kadar çıkabilecek bir thread havuzu kullanma imkanı tanımaktadır. Executors sınıfı ile 3 farklı şekilde thread havuzu oluşturabiliri. Bunlar: SingleThreadExecutor: Bu metod ile yalnızca tek bir thread oluşmasını sağlayabiliriz. CachedThreadPool: Bu metod ile birden fazla thread’e sahip bir havuz oluşturabiliriz. Boşta duran bir thread ihtiyaç duyulduğunda kullanılabilir durumdadır.60 saniye boyunca kullanılmayan threadler yok edilir. FixedThreadPool: Bu metodu kullanarak limitlerini kendimizin belirleyebildiği bir thread havuzu oluşturabiliriz. Limit değerde thread oluşturulmasına rağmen yeni bir thread ihtiyacı duyulursa, process herhangi bir threadin işinin bitmesini bekler. Bana göre en kullanşlısı FixedThreadPool, tabi kullanılacak yere göre bu durum değişebilir. Son olarak işimiz bittiğinde thread havuzumuzu kapatmayı unutmayalım ki boşuna elektrik harcanmasın . Biz kapatmazsak Java bu havuzu kapatmayacaktır. [java]threadPool.shutdown();[/java] Örnek bir Runnable objesi oluşturup thread havuzu kullanarak işlemimizi yapalım: [java] class SampleRunnable extends Runnable{ private String threadName; purblic void run(){ System.out.println(“My name is ”+threadName); Thread.sleep(1000); } } [/java] [java] public class ThreadPoolTest{ //5 adet thread’e sahip bir havuz oluşturalım ExecutorService threadPool = Executors. FixedThreadPool(5); public static void main(String[] args){ List<SampleRunnable> list = new Arraylist<SampleRunnable>(); for(int i=0; i<10; i++){ //10 adet runnable objesi oluşturalım SampleRunnable runnable = new SampleRunnable(“number”+ i ); List.add(runnable); } for(SampleRunnable sampleRunnable : list){ threadPool.execute(sampleRunnable); } threadPool.shutdown(); } } [/java] Bu makalede sürekli Runnable üzerinden örnekler verdim fakat bir de Callable vardır ki ondan da daha sonra bahsederim artık.
Çok güzel bir anlatım olmuş devamını bekliyoruz. 🙂
Runnable ve Callable arasındaki fark nedir ne zaman hangisini kullanmalı?
Ayhan dostum aralarındaki fark; Runnable void bir sınıfken Callable Object tipinde nesne dönen bir sınıftır. Kullanımına gelince, Thread’e yaptırdığın işin sonucu sana lazımsa Callable kullanmanı tavsiye ederim
Güzel anlatım.Teşekkürler.