9

sleep()指定された時間スレッドをスリープさせるために使用されることを理解しています。2 つの例を作成しました。例 1 では、1 つしか作成していないため、、、、として出力され12います34例 2 では、スレッドの 2 つのインスタンスを作成し、出力, 1, 1, 2, 2,33取得しています。44

最初のスレッドの出力が1, 2,の後に 2 番目のスレッドの, 3, でないのはなぜですか?41234

例 1:

// Using sleep() method
  public class Aaa extends Thread{
    public void run(){
        for(int i=1;i<5;i++){
        try{
           Thread.sleep(500); 
        } catch(InterruptedException e){
            System.out.println(e);
        }
        System.out.println(i);
        }
    }
    public static void main(String[] args){
        Aaa m1=new Aaa();
        m1.start();
    }
  }

Output:
    1
    2
    3
    4

例 2:

    // Using sleep() method
  public class Aaa extends Thread{
    public void run(){
        for(int i=1;i<5;i++){
        try{
           Thread.sleep(500); // sleeps thread
        } catch(InterruptedException e){
            System.out.println(e);
        }
        System.out.println(i);
        }
    }
    public static void main(String[] args){        
       Aaa m1=new Aaa(); // creating one object
       Aaa m2=new Aaa(); // creating second object of a class
       m1.start(); // calls run method
       m2.start();
    }
  }


Output:
    1
    1
    2
    2
    3
    3
    4
    4
4

5 に答える 5

7

Runnable2 つのオブジェクトを作成しました。メソッドを呼び出して実行すると、run想像どおりの結果が得られます。

   Aaa m1=new Aaa(); // creating one object
   Aaa m2=new Aaa(); // creating second object of a class
   System.out.println("Calling m1.run()");
   m1.run(); // we call run method
   System.out.println("Calling m2.run()");
   m2.run();

出力

Calling m1.run()
1
2
3
4
Calling m2.run()
1
2
3
4

メソッドが 2 回実行されるためです。

runa のメソッドを呼び出すことは、スレッドを実行する通常の方法でRunnable/Threadないことに注意してください。通常はstartメソッドを使用します。

Threadただし、それぞれを aとstartそれらに入れると、次のようになります。

   Aaa m1=new Aaa(); // creating one object
   Aaa m2=new Aaa(); // creating second object of a class
   System.out.println("Calling m1.start()");
   m1.start(); // thread calls run method
   System.out.println("Calling m2.start()");
   m2.start();

各オブジェクトは独自のスレッドで並行して実行されるため、出力はインターリーブされます。

Calling m1.start()
Calling m2.start()
1 < From thread 1
1 < From thread 2
2 ...
2
3
3
4
4

順序は、スレッドがどのようにインターリーブするかによって明らかに異なります。

あなたを混乱させるかもしれないことの 1 つは、あなたが選択したことextend Threadです。これはお勧めできません。次のようにすることをお勧めしimplement Runnableます。

public class Aaa implements Runnable {
  public void run() {
    for (int i = 1; i < 5; i++) {
      try {
        Thread.sleep(500); // sleeps thread
      } catch (InterruptedException e) {
        System.out.println(e);
      }
      System.out.println(i);
    }
  }

  public static void main(String[] args) {
    Aaa m1 = new Aaa(); // creating one object
    Thread t1 = new Thread(m1); // Its thread
    Aaa m2 = new Aaa(); // creating second object of a class
    Thread t2 = new Thread(m2); // Its thread
    t1.start(); // calls m's run method in a new thread.
    t2.start();
  }

}

これで、オブジェクトが 2 つの異なるスレッドで実行されているため、並行して実行されていることがより明確になりました。

于 2013-09-30T12:03:53.587 に答える
1

2 つのスレッドが同時に動作しています。これがスレッドの使用の要点です。メイン スレッド以外で何かを実行したい場合は、新しいスレッドを起動します。または、2 つのタスクを実行する必要があり、それぞれが別のタスクを待機せずに独自のスレッドで動作する場合は 2 つです。

于 2013-09-30T11:04:24.653 に答える
1

m1 と m2 はメイン スレッドから同じ優先度を取得し、同時に動作します。sleep() は、スレッドが x ミリ秒間ブロック状態になることを許可します。スレッドがスリープ状態になると、ロックは解放されません。

于 2013-09-30T11:11:42.500 に答える
0

目的の出力 1,2, 3, 4, 1, 2, 3, 4 を取得するには、join() メソッドを使用します。このメソッドを使用して、スレッドの実行を制御できます。

Aaa m1=new Aaa();// 1 つのオブジェクト
Aaa m2=new Aaa();を作成 // クラスの 2 番目のオブジェクトを作成
m1.start(); // run メソッドを呼び出します
m1.join()
m2.start();

于 2014-11-05T13:26:22.587 に答える
0

sleep は、特定の期間実行を中断します。これは、CPU を他のスレッドが並行して実行できるようにする効率的な方法です。スリープはロックを解除しません。ただし、スリープを呼び出しても、スレッドが指定された時間中断されるわけではないことに注意する必要があります。

于 2015-04-04T10:07:34.997 に答える