2017-10-15 5 views
1

Javaのマルチスレッドの概念から始めました。私は小さなJavaプログラムを書いたことがありますが、実際にその動作を理解することはできません。Javaマルチスレッドthread.sleep()

public class Mythread implements Runnable{ 

    @Override 
    public void run() { 
     System.out.println("mythread: "); 
     Thread t=new Thread(this,"thread1"); 

     for(int i=1;i<5;i++) 
     { 
      System.out.println("in for of myThread"); 

      try { 
       t.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 

} 


public class ThreadTest { 

    public static void main(String[] args) { 
     System.out.println("in main thread"); 
     Mythread mythread=new Mythread(); 
     Thread thread=new Thread(mythread,"thread0"); 
     thread.start(); 

     for(int i=1;i<5;i++) 
     { 
      System.out.println("main class: "+i); 
      try { 
       Thread.currentThread().sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

私は上記のプログラムを実行すると、スレッド1がスリープ状態になると、スリープ状態になることがわかります。

t.sleep(1000); 

は同じスレッドthread1thread0ていますか? また、私はthread1私のコードのどこに開始していないし、なぜスレッドはスリープ状態になるのですか?

私は完全な参考書をマルチスレッドとJavaを参照するだけの初心者です。

+3

[Thread.sleep](http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#sleep-long-)は静的メソッドです。それはあなたがどこから呼び出されても問題ではありません。それはコンパイルエラーではない非静的なコンテキストでそれを呼び出すことができるJavaのクールです。 – Powerlord

答えて

1

Thread.sleep(...)メソッドは、現在のスレッドをスリープさせます。方法

睡眠に別のスレッドを強制的に一つのスレッドのための安全な方法はありません


あなたはまた、他のミスをしています。。

  1. Threadのサブクラスを作成するのは通常間違いです。スレッディングを行う推奨方法は、Runnableを実装するクラスを作成し、java.lang.Threadのインスタンスをスレッドとして作成することです。さらに、スレッドプール、フォークジョインプールまたはExecutorServiceインスタンスを使用してください。この中

  2. Mythread mythread = new Mythread(); 
    Thread thread = new Thread(mythread, "thread0"); 
    

    あなたが実際に(のみ)Runnableとしてmythreadオブジェクトを使用しています。

  3. run()メソッドで作成したスレッドは決して使用されません。決して起動しないためです。しかし、あなたが行った場合は、スレッドの爆発があります... としてthisでインスタンス化しているので、run()メソッドはスレッドをさらに作成します。

  4. Mythreadをクラス名として選択することで、多くのJavaスタイル違反が発生しています。


は、あなたの質問に答えるために:

は、スレッド1とthread0が同じスレッドを参照しますか?

スレッドがスリープ状態になる理由も、私はその後、私のコードでスレッド1の任意の場所を開始していませんか?

実際、それは眠っているthread0です。あなたは

System.out.println("in for of myThread: " + Thread.currentThread()); 

System.out.println("in for of myThread"); 

を変更する場合は、表示されます...

0

Thread.sleepは、クラスメソッドではなく、インスタンスメソッドです。効果的にはTread.sleep(1000)を呼び出しています。これは、現在実行中のスレッドをスリープさせるスレッドクラスの要求です。

したがって、thread1thread2は同じスレッドではありませんが、各スレッドは1秒間スリープするよう要求します。

btw。任意の良いIDEは、スレッドが静的な方法でアクセスする必要がある型から静的メソッドsleep(long)を教えてくれます。

0

いいえ、thread0thread1は同じスレッドではありません。以前の答えで述べたように、スリープメソッドは静的で、現在のスレッドをスリープ状態にします。 thread1は実行可能状態になったことが一度もないため、スリープ状態になるという概念はありません。スリープ状態になるのはスレッド0です。 これについての詳細は、hereを参照して、スレッドの状態の流れと別のスレッドからの新しいスレッドの作成についての明確な洞察を得ることができます。