7


0

Java関数をわずか30分間実行する方法

30分間しか実行されないJava関数を作成する必要があり、30分の終わりに何かを実行します。 ただし、適切な条件が満たされている場合は、指定された時間の前に自己終了することもできます。 データを収集する必要があるため、関数をスリープ状態にしたくないので、スリープ状態のスレッドはありません。

ありがとう

4 Answer


5


使用:http://download.oracle.com/javase/6/docs/api/java/util/Timer.html#schedule%28java.util.TimerTask,%20long%29 [Timer.schedule(TimerTask、long)]

public void someFunctino() {
    // set the timeout
    // this will stop this function in 30 minutes
    long in30Minutes = 30 * 60 * 1000;
    Timer timer = new Timer();
    timer.schedule( new TimerTask(){
          public void run() {
               if( conditionsAreMet() ) {
                   System.exit(0);
                }
           }
     },  in30Minutes );

     // do the work...
      .... work for n time, it would be stoped in 30 minutes at most
      ... code code code
}


1


`System.currentTimeMillis()`で開始時間を取得し、停止する時間を計算して、現在の時間を時々チェックし、収集したいデータを収集しています。 別の方法は、タイマーとデータ収集を分離して、それぞれを独自のスレッドで実行できるようにすることです。

より具体的な回答を得るには、収集するデータとその収集方法を「何を」伝えるのが役立ちます。


1


このような何かがうまくいくでしょう:

long startTime = System.currentTimeMillis();
long maxDurationInMilliseconds = 30 * 60 * 1000;

while (System.currentTimeMillis() < startTime + maxDurationInMilliseconds) {
    // carry on running - 30 minutes hasn't elapsed yet

    if (someOtherConditionIsMet) {
        // stop running early
        break;
    }
}


1


最新の java.util.concurrent`の方法では、http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html [ ExecutorService`]を使用します。 タイムアウトを取るいくつかの「invoke」メソッドがあります。

これがキックオフの例です。

public static void main(String args[]) throws Exception {
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.invokeAll(Arrays.asList(new Task()), 30, TimeUnit.MINUTES);
    executor.shutdown();
}

「タスク」は次のようになります。

public class Task implements Callable {

    @Override
    public String call() {
        // Just a dummy long running task.
        BigInteger i = new BigInteger("0");
        for (long l = 0; l < Long.MAX_VALUE; l++) {
            i.multiply(new BigInteger(String.valueOf(l)));

            // You need to check this regularly..
            if (Thread.interrupted()) {
                System.out.println("Task interrupted!");
                break; // ..and stop the task whenever Thread is interrupted.
            }
        }
        return null; // Or whatever you'd like to use as return value.
    }

}

また見なさい: