ic ice 2 for loopum var, for 'un size'lari dynamic, bazen cok uzun surebiliyor.

Bu surenin 30 sn'yi gecmesini istemiyorsam ne yapabilirim?

soruldu: 03 Eyl '12, 04:41

codestar's gravatar image

codestar
182312
cevap kabul oranı: 15%

değiştirildi: 14 Şub '13, 10:11

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183


Uzun süren herhangi bir metodu ExecutorService kullanarak çağırabilirsiniz. Metod sonuç üretirse Future olarak size geri dönecektir. Sonuç üretmekte geç kalırsa exception ile çıkar, isterseniz paralel işlemi durdurmak için shutdownNow metodunu çağırabilirsiniz.

import java.util.concurrent.*;

class Main {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Çalışıyor..");
            System.out.println(future.get(3, TimeUnit.SECONDS));
            System.out.println("Bitti!");
        } catch (TimeoutException e) {
            System.out.println("Zaman Aşımı!");
        } finally {
            executor.shutdownNow();
        }
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(4000); // Uzun süren metodunuzu burada çağırın
        return "Sonuç Ürettim!";
    }
}

Kod örneğini çalıştırmak için tıklayın.

permanent link

cevaplandı: 14 Şub '13, 09:07

nurettin's gravatar image

nurettin
2.2k2441
cevap kabul oranı: 14%

Nurettin bey cevabiniz icin tesekkurler,

ancak su kod icin deneme yaparmisiniz?

@Override public String call() throws Exception { for ( ;; ); }

Benim istedigim sonsuz donguye giren bir durumda bu donguyu sonlandirmak,

Executor kullanisli, tamam zaman asimina da ugruyor ama, background da for loopu calismaya devam ediyor ve CPU'yu %100 lere kadar kullandigi oluyor.

Bu islem nasil sonlandirabilir? benim sorum java'yi kill etmeden bunun cozumu var midir?

(14 Şub '13, 09:59) codestar codestar's gravatar image

sn harun malesef java istediğiniz gibi çalışmıyor. Ya döngülerin en içtekine bir Thread.sleep(0); koyarsınız, ya da if( Thread.currentThread().isInterrupted() ) return "olmuyor yapamıyorum"; ile executorservice havuzunun durdurulup durdurulmadığını anlayıp döngüyü durdurabilirsiniz. Ayrıca thread durdurmaca olayı 1.4ten itibaren kütüphaneden kaldırılacak olarak işaretlendi.

(14 Şub '13, 10:27) nurettin nurettin's gravatar image

Daha iyi bir yolu vardır elbette ancak, ilk aklıma gelen. Döngüye girmeden önce değişkene atadığınız bir DateTime'i for döngüsü içerisinde kontrol ederek (CurrentTime-StartTime) > 30 durumu sağlandığında döngüyü sonlandırabilirsiniz.

permanent link

cevaplandı: 03 Eyl '12, 05:01

Dreamcatcher's gravatar image

Dreamcatcher
2106812
cevap kabul oranı: 22%

@Dreamcatcher tamam for icin bunu yapabilirsin fakat baska bir yerde de, kullandigim bir kutuphanenin icindeyse bu dongu ona nasil mudahale edebilirim?

(03 Eyl '12, 05:03) codestar codestar's gravatar image
1

Eğer müdehale edemediğin bir kütüphane içindeyse -multi thread bilgim zayıf doğruluğundan emin değilim- bu işlemi ayrı bir Thread'de çalıştırıp, thread timeout (direk timeout değişkeni belirlenemiyor ancak kodda böyle birşey oluşturulabilirmuş google aramalarında çıktı) oluşturup durumu çözebilirsin belki.

(03 Eyl '12, 05:09) Dreamcatcher Dreamcatcher's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,077

Soruldu: 03 Eyl '12, 04:41

Görüntüleme: 2,399 kez

Son güncelleme: 14 Şub '13, 10:28

powered by BitNami OSQA