22 Mayıs 2011 Pazar

Java Thread - ExecutorService Örneği - Seri / Paralel

Aşağıda, Java 1.5 ile birlikte gelen ExecutorService arayüzünü kullanarak oluşturduğum bir multithread uygulama örneğini paylaşmak isterim. Bu örnekte, işlemlerin paralel ve seri olarak çalıştırılması ve sonuçlarının dönülmesini görebilirsiniz:

package karalama.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

class TaskResult {
private String resultStr;
public TaskResult(String resultStr) {
this.resultStr = resultStr;
}
public String getResultStr() {
return resultStr;
}

}

public class ExecuterTester {

private static final class CallableTask implements Callable<TaskResult> {
private String name ;
private long waitTime;

public CallableTask(String name, long waitTime) {
this.name = name;
this.waitTime = waitTime;
}

@Override
public TaskResult call() throws Exception {
System.out.println(name
+ " started");
long t = System.currentTimeMillis();
Thread.sleep(waitTime);
String result
= name + " ended - " + (System.currentTimeMillis()-t) / 1000 + " sn geçti.";
//System.out.println(result);
return new TaskResult(result);
}
}

public static void main(String args[]) {
ExecutorService executorService
= Executors.newCachedThreadPool();
List
<Callable<TaskResult>> tasks = new ArrayList<Callable<TaskResult>>();

tasks.add(
new CallableTask("task1", 1000));
tasks.add(
new CallableTask("task2", 2000));
tasks.add(
new CallableTask("task3", 3000));
tasks.add(
new CallableTask("task4", 4000));
tasks.add(
new CallableTask("task5", 5000));

try {
System.out.println(
"Paralel İşlem");
long t = System.currentTimeMillis();
List
<Future<TaskResult>> futureList = executorService.invokeAll(tasks);
for (Future<TaskResult> future : futureList) {
TaskResult taskResult
= future.get();
System.out.println(taskResult.getResultStr());
}
System.out.println(
"Toplamda " + (System.currentTimeMillis()-t) / 1000 + " sn geçti.");
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}

System.out.println(
"\nSeri İşlem");
long t = System.currentTimeMillis();
for (Callable<TaskResult> task : tasks) {
Future
<TaskResult> future = executorService.submit(task);
try {
TaskResult taskResult
= future.get();
System.out.println(taskResult.getResultStr());
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}

}
System.out.println(
"Toplamda " + (System.currentTimeMillis()-t) / 1000 + " sn geçti.");
}



}


Uygulama Çıktısı:

Paralel İşlem
task1 başladı
task2 başladı
task3 başladı
task4 başladı
task5 başladı
task1 bitti - 1 sn geçti.
task2 bitti - 2 sn geçti.
task3 bitti - 3 sn geçti.
task4 bitti - 4 sn geçti.
task5 bitti - 5 sn geçti.
Toplamda 5 sn geçti.

Seri İşlem
task1 başladı
task1 bitti - 1 sn geçti.
task2 başladı
task2 bitti - 2 sn geçti.
task3 başladı
task3 bitti - 3 sn geçti.
task4 başladı
task4 bitti - 4 sn geçti.
task5 başladı
task5 bitti - 5 sn geçti.
Toplamda 15 sn geçti.


ali kemal taşçı

Hiç yorum yok: