ThreadPool, ExecutorService

Kategori: Java , 20 Temmuz 2019 , JanFranco


Büyük projelerimizde yüzlerce Thread kullanabiliriz. Her bir Thread için ayrı ayrı işlem yapmak kod okunabilirliği, sadeliği açısından iyi bir şey değildir. Örneğin aynı anda sadece 2 thread çalışmasını istiyoruz. Elimizde 100 thread mevcut. Tek tek bu threadleri çalıştırıp, join methodlarını kullanmamız yorucu olabilir. Neyse ki ExecutorService ve ThreadPool teknikleri ile bunu çok kolayca yapabiliriz. Bir Worker sınıfı açalım:


public class Worker implements Runnable{
	
	private String name;
	private int taskID;

	public Worker(String name, int taskID) {
		this.name = name;
		this.taskID = taskID;
	}
	
	@Override
	public void run() {
		System.out.println(name + " starts the task: " + taskID);
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(name + " finished the task: " + taskID);
	}

}
Burada işlemleri görebilmek için Thread.sleep(4000) methodu ile işlemi 4 saniye beklettik. Main_class'ta ExecutorService tanımlayalım:

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

public class Main_class {
	
	public static void main(String[] args){
		
		ExecutorService executor = Executors.newFixedThreadPool(2);
		
		for(int i=1; i<=5; i++) {
			executor.submit(new Worker(String.valueOf(i), i));
		}
		
		executor.shutdown();
		
	}
	
}
Burada ExecutorService sınıfından bir obje tanımladık ve referans olarak newFixedThreadPool methodunu gönderdik. Burada gönderdiğimiz parametre aynı anda kaç thread'in çalışacağını belirtiyor. executor.submit methodunu kullanarak threadleri çalıştırdık. Bunu da bir for döngüsü içinde yaptık. Amacımız ikişer ikişer threadlerin çalışması ve son thread'in tek başına çalışması. Daha sonra executor.shutdown methodu ile işlemleri durdurduk. main methodu da bir thread olduğundan bu methodu mutlaka kullanmalıyız. Sonucu görelim:

1 starts the task: 1
2 starts the task: 2
1 finished the task: 1
2 finished the task: 2
3 starts the task: 3
4 starts the task: 4
3 finished the task: 3
4 finished the task: 4
5 starts the task: 5
5 finished the task: 5


Sonraki Yazı: BlockingQueue, ProducerConsumer
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın