1

私はJavaの初心者で、このコードを作成しましたが、そのスレッドは1回しか実行されません。スレッドを動的にするにはどうすればよいですか?

//メイン プログラム - 2 つのスレッドを作成します。残念ながら、この時点では実行中のスレッドは 1 つだけです

public static void main(String[] args){
    timeThread ttm = new timeThread();
    ttm.name = "map";
    ttm.min = 1000;
    ttm.max = 5000;
    ttm.start();

    timeThread tta = new timeThread();
    tta.name = "arena";
    tta.min = 6000;
    tta.max = 10000;
    tta.start();
}

//プログラムで呼び出しているタイムスレッド

static class timeThread{
    static String name;
    static int min;
    static int max;
    static int random;
    static Thread t = new Thread () {
        public void run () {
            while (true){
                random = genRandomInteger(min,max);
                System.out.println("Thread named: " 
      + name + " running for: " 
      + random + " secconds...");
                try {
                    Thread.sleep(random);
                } catch(InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }   
            }
        }
    };
    void start(){
        t.start();
    }
}

//ランダム関数ジェネレータ

  private static int genRandomInteger(int aStart, int aEnd){
    int returnValue = aStart + (int)(Math.random() 
* ((aEnd - aStart) + 1));
    return returnValue;
}
4

1 に答える 1

4

スレッドを静的に初期化しています! これは、クラスがロードされるときに一度作成されることを意味します。

あなたのコードは、書かれていることを正確に実行します。

クラスを変更する必要がありますTimeThread。 static キーワードを削除し、変数をクラス メンバーにします。このような:

static class TimeThread implements Runnable {
    String name;
    int min;
    int max;
    int random;
    Thread t;

    public void run () {
        while (true){
            random = genRandomInteger(min,max);
            System.out.println("Thread named: " + name + " running for: " 
                               + random + " secconds...");
            try {
                Thread.sleep(random);
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }   
        }
    }

    void start(){
        t = new Thread (this);
        t.start();
    }
}

いくつかのヒント:

  • スレッド初期化コードをメソッドに入れます。
  • 匿名クラスを使用せず、run()メソッドを記述してコンストラクターTimeThreadに渡しますthisThread
  • ゲッターとセッターを使用します。これらは良い習慣と見なされます
  • Java でのプログラミングについてもっと学んでください... あなたのコードから見ると、あなたはスレッドにまったく触れていません。
  • あなたの「実行中」のテキストは、実際には乱数を示しています...実際にはそうすべきではありません。
于 2013-09-01T06:43:16.950 に答える