Java実行の遅延

私はJavaの実行をdealyする簡単な方法があるかどうかを知りたい。

function(){
  command 1;   
  thread.sleep();
  command 2;
  thread.sleep();
  ... and soo on
}

私は私の機能の各ステップを遅らせたいのですが、そこにはもっと良い方法がありますか?

0
@DaveとSaury私はその最も簡単な方法を知っていますが、私は1000ステップと私は各ステップの後に遅延が必要と言うとき。だから、私は古代の方法を使っても何の問題もない、これのためのラウンドを探しているだけです。クリスは私です。
追加された 著者 Daniel Euchar,
どのくらい簡単に得ることができますか?
追加された 著者 Dave Newton,
あなたはこのタグを使用してJava EEコンテナでこれを使用していますか?
追加された 著者 Kris,
私はこれがこれを行う最もクリーンな方法だと思います。なぜあなたはこのオプションに満足していませんか?
追加された 著者 Saurabh,

4 答え

このようなものを使うこともできますが、私は良い考えではありません。 DaveHowes に同意します。これを行う簡単な方法はありません。

package main;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

public class TempClass {
    public static void main(String[] args) throws ParseException, InterruptedException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        new TempClass().function();
    }

    private void function() throws NoSuchMethodException, InterruptedException, InvocationTargetException, IllegalAccessException {
        final Class aClass = this.getClass();
        List methods = new ArrayList() {{
            add(aClass.getDeclaredMethod("command1"));
            add(aClass.getDeclaredMethod("command2"));
        }};
        for (Method method : methods) {
            method.setAccessible(true);
            method.invoke(this);
            Thread.sleep(1000);
        }
    }

    private void command1() {
        System.out.println("command1");
    }

    private void command2() {
        System.out.println("command2");
    }
}
2
追加された
@DanielEucharリフレクションを使用する呼び出しメソッドは直接呼び出しよりも遅くなりますが、Methodクラスの代わりに "cglib"ライブラリのFastMethodクラスを使用できます。 Standart Javaリフレクションを使用するJNI呼び出し( en.wikipedia.org/wiki/Java_Native_Interface )、cglibはるかに速く動作します。私はここでそれを見つけることができます: cglib.sourceforge.net
追加された 著者 kornero,
うん、私は本当にこのことが大好きだけど、私はまた、パフォーマンスの賢明さを知りたいのは、このやり方や古い方法を選択する方が良いです。 ?
追加された 著者 Daniel Euchar,
@ kornero - 私は遅いメソッド呼び出しはここに問題はないと信じています。彼はそれらを遅らせたいと思っています。
追加された 著者 Carlos Heuberger,

コマンドをListなどのデータ構造体に入れ、コマンドを実行したメソッドにリストを渡してから一定期間スリープすることができます。おそらくもっとエレガントかもしれませんが、確かに単純ではありません。

また、Timerに追加することも考えられますが、やはりエレガントですが、機能を大幅に改善することなくかなりの機械を使用します。

1
追加された

あなたはなぜこれをしたいのかは言わない。あなたのコードにたくさんの遅延を加えるよりも、最終目標を達成するためのよりよい方法があるかもしれません。

これがアプリケーションの大部分で必要とされた場合は、遅延メカニズムを外部から適用することになります。

  • デバッグ用の場合は、 JPDA StepRequest 型。

  • まれなイベントの場合は、これをプロダクションコードで使用することをお勧めします。 ASM

0
追加された
私は、Javaを使用して私のテストケースのいくつかを自動化しています。これらの遅延はthinktimeのようなものを追加したいのです。
追加された 著者 Daniel Euchar,

速度テスト:

package test;

import net.sf.cglib.reflect.FastClass;
import net.sf.cglib.reflect.FastMethod;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

public class Test {

    private static final long SLEEP = 0;
    private static final Object[] withoutParameters = new Object[0];

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InterruptedException, IllegalAccessException {
        final Method[] methods = getMethods(Test.class, "command1", "command2");
        final FastMethod[] fastMethods = getFastMethods(Test.class, methods);
        final Test test = new Test();
        final int loop = 10* 1000 * 1000;

        long timeStamp = System.currentTimeMillis();
        for (int i = 0; i < loop; i++) {
            test.functionDirectCall();
        }
        System.out.println("DirectCall time:" + (System.currentTimeMillis() - timeStamp));

        timeStamp = System.currentTimeMillis();
        for (int i = 0; i < loop; i++) {
            test.functionMethod(methods);
        }
        System.out.println("Method time:" + (System.currentTimeMillis() - timeStamp));

        timeStamp = System.currentTimeMillis();
        for (int i = 0; i < loop; i++) {
            test.functionFastMethod(fastMethods);
        }
        System.out.println("FastMethod time:" + (System.currentTimeMillis() - timeStamp));
    }

    private void functionDirectCall() throws InterruptedException {
        this.command1();
        Thread.sleep(SLEEP);
        this.command2();
        Thread.sleep(SLEEP);
    }

    private void functionMethod(Method... methods) throws InvocationTargetException, IllegalAccessException, InterruptedException {
        for (Method method : methods) {
            method.invoke(this);
            Thread.sleep(SLEEP);
        }
    }

    private void functionFastMethod(FastMethod... fastMethods) throws InvocationTargetException, InterruptedException {
        for (FastMethod fastMethod : fastMethods) {
            fastMethod.invoke(this, withoutParameters);
            Thread.sleep(SLEEP);
        }
    }

    private static Method[] getMethods(final Class aClass, final String... methodNames) throws NoSuchMethodException {
        return new ArrayList() {{
            for (String methodName : methodNames) {
                final Method method = aClass.getDeclaredMethod(methodName);
                method.setAccessible(true);
                this.add(method);
            }
        }}.toArray(new Method[methodNames.length]);
    }

    private static FastMethod[] getFastMethods(final Class aClass, final Method... methods) {
        final FastClass fastClass = FastClass.create(aClass);
        return new ArrayList() {{
            for (Method method : methods) {
                add(fastClass.getMethod(method));
            }
        }}.toArray(new FastMethod[methods.length]);
    }

    public void command1() throws InterruptedException {
        Thread.sleep(SLEEP);
    }

    public void command2() throws InterruptedException {
        Thread.sleep(SLEEP);
    }
}

出力:

DirectCall time:17615
Method time:19051
FastMethod time:17952
0
追加された
おかげさまで、ありがとうございました。
追加された 著者 Daniel Euchar,