2013-04-20 25 views
8

Java'da Metin dosyasını belirli bir şekilde işleyen bir işlev var. Ancak, çok fazla zaman alırsa, bu metin dosyası için işlem büyük olasılıkla işe yaramaz (nedeni ne olursa olsun) ve bunu atlamak isterim. Ayrıca, işlem çok uzun sürerse, aynı zamanda çok fazla bellek kullanır. Ben bu şekilde çözmeye çalıştık ama çalışmıyor: docs sadece List bir dizindeki dosyaların olduğuÇok uzun sürerse işlevi atla

for (int i = 0; i<docs.size(); i++){ 
    try{ 
     docs.get(i).getAnaphora(); 
     } 
    catch (Exception e){ 
     System.err.println(e); 
    } 
} 

. Genelde kodu el ile durdurmam gerekir çünkü belirli bir dosyada '' bu dosyaya bağlı olarak '' kalmış ''.

Bu işlev çağrısı için zamanı ölçmenin bir yolu var mı ve Java'ya işlevin atlamasını beklemek için bir işlev var mı, işlev 10 saniyeden daha uzun sürüyor?

DÜZENLEME
birlikte birkaç farklı cevaplar kazıma sonra çalışıyor bu çözüm geldi. Belki de başkası bu fikri kullanabilir. İlk runable (gerekirse Konuya argümanlar geçirebilirsiniz bu şekilde) uygulayan bir sınıf oluşturmak

:

public class CustomRunnable implements Runnable { 

    Object argument; 

    public CustomRunnable (Object argument){ 
     this.argument = argument; 
} 

    @Override 
    public void run() { 
     argument.doFunction(); 
    } 
} 

Sonra bir fonksiyonun zaman izlemek için main sınıfında bu kodu kullanın (argument.doFunction()) ve çıkış o kadar uzun sürerse:

Thread thread; 
for (int i = 0; i<someObjectList.size(); i++){   
    thread = new Thread(new CustomRunnable(someObjectList.get(i))); 
    thread.start(); 
    long endTimeMillis = System.currentTimeMillis() + 20000; 
    while (thread.isAlive()) { 
     if (System.currentTimeMillis() > endTimeMillis) { 
     thread.stop(); 
     break; 
    } 
    try { 
     System.out.println("\ttimer:"+(int)(endTimeMillis - System.currentTimeMillis())/1000+"s"); 
     thread.sleep(2000); 
     } 
    catch (InterruptedException t) {} 
    } 
} 

Ben stop() depcecated edilir farkındayım ama durdurmak ve bunu durdurmak istediğinizde parçacığı çıkmak için başka bir yol bulamadım.

+1

bu bir göz atın: [http://stackoverflow.com/questions/8982420/time-out-method-in-java][1] [1]: arayüzleri için http://stackoverflow.com/questions/8982420/time-out-method-in-java –

+0

Bu benim çözüm kazanmasına yardımcı, thanks :) – Tim

cevap

8

Kodunuzu Runnable veya Callable numaralı telefona gönderin ve yürütmek için uygun bir Executor'a gönderin. Gönderme yöntemlerinden biri, kodun geçmesinin ardından bir zaman aşımı süresi alır.

+0

Ben aradık kısaca ve bu sorunun doğru cevabı gibi görünüyor. Ancak bunu nasıl yapacağımı bilmiyorum. Ona bakacağım. – Tim

+0

Bir örnek verebilir misiniz? – CMCDragonkai

0

System.nanoTime() iç çalışma yöntemini koşul olarak kullanabilirsiniz. Örneğin

,

long cur = System.nanoTime(); //records the time when start executing 
... 
double elapsedTime(System.nanoTime() - cur)/1000000.0; // at the end