2013-04-20 3 views
8

Javaでは、テキストファイルを特定の方法で処理する機能があります。ただし、処理に時間がかかりすぎると、そのテキストファイルのプロセスが無駄になる可能性が高くなります(理由は何であれ)。スキップします。さらに、処理に時間がかかり過ぎると、あまりにも多くのメモリが使用されます。私はこの方法でそれを解決しようとしたが、それは動作しません:docsはちょうどListディレクトリ内のファイルである長すぎると機能をスキップする

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

。通常、私は手動でコードを停止する必要があります。なぜなら、特定のファイル(そのファイルの内容に応じて)に「固まっている」ためです。

その関数呼び出しの時間を測定し、Javaに関数が10秒以上かかるファイルをスキップするように指示する方法はありますか?

EDIT
一緒に、いくつかの異なる答えを掻き落とした後、私は正常に動作します。このソリューションを思い付きました。多分誰かがこのアイデアを使うことができます。

まずRunable(必要な場合は、スレッドへの引数に渡すことができますこの方法)を実装するクラスを作成します。

public class CustomRunnable implements Runnable { 

    Object argument; 

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

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

次に、関数の時間を監視するmainクラスでこのコードを使用します(argument.doFunction()それは長いにかかる場合)とexit:

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) {} 
    } 
} 

私はstop()がdepcecatedされ実現が、私はそれを停止する場合は、スレッドを停止して終了するには、他の方法を発見していません。

+1

これを見てください: を[http://stackoverflow.com/questions/8982420/time-out-method-in-java][1] は、[1]:インターフェイス用http://stackoverflow.com/questions/8982420/time-out-method-in-java –

+0

これは私が私の解決策を実現する助け、感謝:) – Tim

答えて

8

RunnableまたはCallableにコードをラップし、適切な実行者に送信して実行してください。送信メソッドの1つがタイムアウトした後、コードが渡されて中断されます。

+0

私が検索した簡潔これは問題の正解と思われます。しかし私はまだそれをやる方法を知らない。私はそれを調べます。 – Tim

+0

あなたは例を挙げることができますか? – CMCDragonkai

0

System.nanoTime()の実行方法を条件として使用できます。例えば

long cur = System.nanoTime(); //records the time when start executing 
... 
double elapsedTime(System.nanoTime() - cur)/1000000.0; // at the end 
関連する問題