Soru & Cevap

multithread

29.04.2017 - 01:51

Merhaba, ben therad kullanarak büyük sayıların faktöriyelini hesaplamaya çalışıyorum.Fakat seri hesaplamada paralel hesaplamaya göre sonuç daha hızlı oluyor.Nasıl çözebilirim .Teşekkürler

 

 

public class Faktoriyel implements Runnable{

private Sayi sayi;
public Sayi faktoriyelSonuc;
public Faktoriyel(Sayi sayi){
    this.sayi = sayi;
}

@Override
public void run() {
BigInteger fact = new BigInteger("1");
for (int i = 1 ;i <= sayi.GetSayi().longValue() ; i++) {
    fact = fact.multiply(new BigInteger(i + ""));
    }     
faktoriyelSonuc = new Sayi(fact.toString());
System.out.println(faktoriyelSonuc.GetSayi());
}
}

 

------------------------------------------------

public class Project1{

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    long baslangicSeri = System.nanoTime();
    System.out.println(SeriFaktoriyel(new Sayi("200000")));
    long bitisSeri = System.nanoTime();
    double SerigecenSure = (double)(bitisSeri-baslangicSeri)/1000000000;
    System.out.println("Seri Hesaplama : "+SerigecenSure+" saniye");

    long baslangicParalel = System.nanoTime();
    ExecutorService havuz = Executors.newFixedThreadPool(10);
    havuz.execute(new Faktoriyel(new Sayi("200000")));
    havuz.shutdown();
    while(!havuz.isTerminated()){ }
    long bitisParalel = System.nanoTime();
    double gecenSure = (double)(bitisParalel-baslangicParalel)/1000000000;
    System.out.println("Paralel hesaplama : "+gecenSure+" saniye");     

public static String SeriFaktoriyel(Sayi sayi){
     BigInteger fact = new BigInteger("1");
for (int i = 1; i <= sayi.GetSayi().longValue() ; i++) {
    fact = fact.multiply(new BigInteger(i + ""));
    }
   return fact.toString();
}
}

16 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user gmyucalfarukeren
gmyucalfarukeren
22.02.2023 - 01:41

Selam Neslihan Hanım. Öncelikle, ExecutorService'in submit() yöntemini kullanarak Faktoriyel işlemini havuza ekleyebilirsiniz. Bu şekilde, her bir işlem run() yöntemini kendi thread'inde çalıştırılabilir ve işlemin bitmesini beklemek için while(!havuz.isTerminated()){ } döngüsüne ihtiyacınız olmaz. Ayrıca, işlemlerin sonuçlarını depolamak için Faktoriyel sınıfında tanımladığınız faktoriyelSonuc değişkenini kullanabilirsiniz

 

public class Faktoriyel implements Callable<Sayi> {

    private Sayi sayi;

    public Faktoriyel(Sayi sayi) {
        this.sayi = sayi;
    }

    @Override
    public Sayi call() {
        BigInteger fact = new BigInteger("1");
        for (int i = 1; i <= sayi.GetSayi().longValue(); i++) {
            fact = fact.multiply(new BigInteger(i + ""));
        }
        return new Sayi(fact.toString());
    }
}

public static void main(String[] args) {
    long baslangicSeri = System.nanoTime();
    System.out.println(SeriFaktoriyel(new Sayi("200000")));
    long bitisSeri = System.nanoTime();
    double SerigecenSure = (double) (bitisSeri - baslangicSeri) / 1000000000;
    System.out.println("Seri Hesaplama : " + SerigecenSure + " saniye");

    long baslangicParalel = System.nanoTime();
    ExecutorService havuz = Executors.newFixedThreadPool(10);
    List<Future<Sayi>> sonuclar = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        Future<Sayi> sonuc = havuz.submit(new Faktoriyel(new Sayi("200000")));
        sonuclar.add(sonuc);
    }
    havuz.shutdown();
    while (!havuz.isTerminated()) {
    }
    Sayi paralelSonuc = new Sayi("1");
    for (Future<Sayi> sonuc : sonuclar) {
        try {
            paralelSonuc = paralelSonuc.carp(sonuc.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
    long bitisParalel = System.nanoTime();
    double gecenSure = (double) (bitisParalel - baslangicParalel) / 1000000000;