Thread.sleep()についての疑問

このQ&Aのポイント
  • JavaでThread.sleep(duration);と書く場合、停止の対象となるスレッドはどうなるのか
  • Thread.sleep()がインスタンスから呼び出せるなら、thread(インスタンス).sllep()と書くことでそのインスタンスを休止するが、Thread.sleep()と書くのでわかりずらい
  • メインスレッドを対象としているのか、スレッドを継承したクラスでThread.sleep()と書くとそのクラスを休止させるのか
回答を見る
  • ベストアンサー

Thread.sleep()について(休止の対象は)。

こんにちは。 Javaで、 Thread.sleep(duration);と書いた場合、 停止の対象となるスレッドは どうなるのでしょうか。 もし、sleep()がインスタンスから、 呼び出せるなら、thread(インスタンス).sllep() と書くことで、そのインスタンス(スレッドを 継承したクラス)を休止するので、 分かりやすいのですが、Thread.sleep()と 書くので、わかりずらいです。 以下のような、書き方に戸惑っています。 public class xx{ public static void main(String args){ while(1){ Thread.sleep(1000); System.out.println("abc"); } } } これは、 メインスレッドを対象としている、 と考えていいのでしょうか。 スレッドを継承したクラスで、 Thread.sleep()と書いたときは、 そのクラスを休止させる、 という理解で、いいのでしょうか。 何かアドバイスできる人がいましたら、 よろしくお願いします。

  • rheda
  • お礼率69% (257/372)
  • Java
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • foggi47
  • ベストアンサー率87% (7/8)
回答No.1

Thread.sleepを実行したスレッドを停止します。 スレッドはクラスごとではないので、あるクラスのメソッドを別クラスで作ったスレッドから実行すると、呼び出したほうのスレッドで実行されることになります。 例えば、 public class xx{  public static void main(String[] args){   Thread thread1 = new Thread(){    @Override public void run(){     while(true){      try {       Thread.sleep(1000);       System.out.println("abc");      } catch (InterruptedException ex) {       ex.printStackTrace();      }     }    }   };   thread1.start();  } } こうしたら、thread1が停止されます。 あとJavaだとwhile(1)だとコンパイルエラーになるような? while(true)にしないと。

関連するQ&A

  • Thread.sleep()はすべてのスレッドを停止する?

    Threadを継承したCarというインスタンスを5つ作ってstart()させたとします。 そのあと、クラスメソッドのThread.sleep(1000)をすると、すべてのThreadインスタンスが1秒止まるのかと思ったのですが、そうではないといわれました。 クラスメソッドのThread.sleep()は何をsleepさせるのでしょうか?

    • ベストアンサー
    • Java
  • Thread のターゲット切り替えについて

    以下のようなソースを書きました。Runnableを実装しているクラスをスーパークラスに持つクラスThreadSampleChildをインスタンス化した後にそのクラスのThreadを実行し、途中で親クラスのスレッドに切り替えることを目的としているのですが、切り替わらずに子クラスのThreadが引き続き継続してしまいます。 理由はなんとなくわかるのですが。子クラスから親クラスのThreadを実行させるためにはどう工夫すればよいのでしょうか? class ThreadSample implements Runnable { Thread threadp; ThreadSample() { } public void run() { while(true) { try { System.out.println("Parent"); Thread.sleep(500); } catch(Exception e) { break; } } } public void makingThreadParent() { threadp = new Thread(this); } } class ThreadSampleChild extends ThreadSample { Thread threadc; ThreadSampleChild() { } public void run() { while(true) { try { System.out.println("Child"); Thread.sleep(500); } catch(Exception e) { break; } } } public void makingThreadChild() { threadc = new Thread(this); } public void exe() { while(true) { threadc.start(); try { Thread.sleep(10000); } catch(Exception e) { } threadc.interrupt(); makingThreadParent(); System.out.println("Thread Change !!!!"); threadp.start(); try { Thread.sleep(10000); } catch(Exception e) { } threadp.interrupt(); } } public static void main(String args[]) { ThreadSampleChild tsc = new ThreadSampleChild(); tsc.makingThreadChild(); tsc.exe(); } }

    • ベストアンサー
    • Java
  • Runnableのインスタンス化について

    下記のコードについてです。 Runnableがインスタンス化されていますが、 どうしてそれが可能なのかが分かりません。 分からない点は 1.Runnableはインタフェースであるから、本来、直接インスタンス化は不可能であるはず。 2.しかし、Runnableはクラスライブラリjava.langパッケージに含まれている。 だからインスタンス化は可能なのかもしれない。 3.あるいは、下記のコードではメソッド内の無名クラスであるから、「new Runnable(){」の 部分でスーパークラスとしてのRunnableを継承したサブクラスを生成しているのかもしれない。 アドバイスをよろしくお願い致します。 public class Main{ public static void main(String[]args){ Runnable task = new Runnable(){ public void run(){ System.out.println("run"); } }; Thread thread = new Thread(task){ public synchronized void start(){ System.out.println("start"); } }; thread.start(); } }

    • ベストアンサー
    • Java
  • java Threadのsleepを途中で止める方

    今、訓練校に通っていて課題をだされていますが、どうもうまく行きませんのでお知恵を拝借したく思います。  java Threadのsleepを使用し、クイズの回答を10秒以内で答えるというものですが、 途中で入力をすると、次の問題の回答時間が異様に早くなり1秒ではなくなってしまいます。  こういう場合、入力をすれば、runメソッドが終わるというプログラムはどうやって書けばいいのか教えて頂きたく思います。 どうぞよろしくお願いいたします。 <下記、threadの部分だけですが、パッケージを使用するという課題のため無理やり使っています。> package pa; public class CountTest extends Thread { public void start() { super.start(); } public void run() { for (int i=10; i >= 1; i--) { try{ sleep(1000); System.out.print("⇒" ); }catch(InterruptedException e){} } System.out.println(""); for (int i=1; i >= 1; i--) { / } System.out.println("Time up "); System.out.println(""); System.out.println("1-4で答えを記入してください"); }

    • ベストアンサー
    • Java
  • スレッド間の送受信のコードについて

    下記のコードは、(以前お教え頂きました)『synchronized』を使用した、スレッド間の 送受信のコードですが、その代わりに、Interruptとか、Thread.sleep()を使用した、 コードに変更してみたいと思います。 Q1)そのコードをお教え頂けないでしょうか? class T_thread { public static void main(String args[]) { new rcvInterrupt().start(); } } class genInterrupt extends Thread { private rcvInterrupt target; genInterrupt(rcvInterrupt targetx) { this.target = targetx; } public void run() { System.out.println("genInterupt start"); for (int i = 0; i < 10; i++) { while (!target.isWaited) { // rcvInterruptがsynchronizedブロックに入るまで待ち合わせ // これがないと連続してsynchronizedしてしまう可能性がある } synchronized (target) { target.notifyAll(); target.isWaited = false; System.out.println("notify"); } } } } class rcvInterrupt extends Thread { volatile boolean isWaited; public synchronized void run() { new genInterrupt(this).start(); for (int i = 0; i < 10; i++) { try { isWaited = true; wait(); System.out.println("get interrupt cnt=" + i); } catch (InterruptedException e1) { } } } } 以上

    • ベストアンサー
    • Java
  • c# スレッド間でのデータの共有

    C#でメインプロセスと生成されたスレッド間でデータの共有をさせたいのですがどのようにすればいいのでしょうか。ご教授お願い致します。 ・メインプロセス(A) ・Aから生成されたスレッド(B) 例えば、AとBで変数の値をそれぞれ読み書きさせたい場合 どのようにすればよいのでしょうか。 class TEST { public int flag; // メインプロセス(A) public static void Main() { Thread t = new Thread(new ThreadStart(abc)); t.IsBackground = true; t.Start(); while(ture) { Thread.Sleep(10); Console.WriteLine("A:{0}",flag); } } // Aから生成されたスレッド(B) public void abc() { Console.WriteLine("B:{0}",flag); flag++; } }

  • スレッドの待機と再開

    お世話になります。 マルチスレッドのプログラムで悩んでいます。 public class ThreadLocker {  private static boolean isLocked = false;    public static void lock() {   isLocked = true;   while(isLocked) { ; }  }    public static void unlock() {   isLocked = false;  } } まず、このようなクラスを定義しました。そして複数のスレッドが ThreadLocker.lock(); を呼び出して、処理の進行をストップしている状態があるとします。この状態に対して、とある別のスレッドが ThreadLocker.unlock(); を呼び出すと、それまで無限ループしていたスレッドが解放されて処理を始める、という感じです。 この方法を試してみましたが、無限ループで何も処理をしていないとは言え、リソースを食いまくっているようで、マシンが重くなってしまいました。 そこで、スレッドの待機・再開を行う事ができる wait / notify(All?) メソッドを使用すれば良いのではないかと考えたのですが、具体的な方法が分からず、質問させていただきました。 具体的に、どのインスタンスの wait 及び notify(All?) を呼び出せば良いのかが分かりません。 APIリファレンスの「現在のスレッドはこのオブジェクトのモニターのオーナでなければなりません。」の意味もよく分かりません。 ちなみに、待機しているスレッドは複数あり、class Lock の method execute 中で ThreadLocker.lock() しているとします。 また、再開を促すスレッドは1つで、class Unlock の method execute 中で ThreadLocker.unlock() を呼び出すものとします。 そして、それぞれのスレッドは、お互いのインスタンスを知りません。(説明しづらいので、補足要求があれば、ソースで示します。) よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Javaのサーブレットについて(マルチスレッド)

    サーブレットについて質問です。 サーブレットは1インスタンス・複数スレッドという形態で、 サーブレットコンテナにより管理されていると思います。 では、このコンテナ内では、どのように1インスタンス・複数スレッドを 実現しているのでしょうか? 以下、自分なりに考えたプログラムです。 たぶん、このようにすれば、1インスタンス・複数スレッドになるのかと思うのですが。 どなたかご教授願いますでしょうか。 よろしくお願いいたします。 【1インスタンス・複数スレッドプログラム例】 public class TestThread extends Thread { public void run() { System.out.println("TestThread.run()"); } public static void main(String[] args) { Thread tt = new TestThread(); Thread th1 = new Thread(tt); Thread th2 = new Thread(tt); th1.start(); th2.start(); } }

  • Threadの終了

    http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html を見ると,スレッドの止め方が書いてありますが, これは,スレッドblinker内でループが回っていて初めてうまく行く, と(間違ってるかもしれませんが)理解しています. では下記のように,Thread2でループが回っていない場合は (*)の位置でThread2を止めるにはどうすればいいのか, 教えてくださる方はいらっしゃいませんでしょうか. (**)のClassAではSWTでGUIを表示させていて, それをThread1から閉じるというのが目的です. GUIを閉じない限りその先には進まないので, ループを回しThread2のrun()内で待機させることが出来なくて. public class Thread1 { Thread1(){ Thread2 t2 = new Thread2(); t2.start(); try { Thread.sleep(5000); } catch (InterruptedException e) { } (*)ここでThread2を終了させたい. } public static void main(String args[]){ new Thread1(); } class Thread2 extends Thread { public void run() { new ClassA(); ・・・(**) } } }

    • ベストアンサー
    • Java
  • ThreadとRunnableのlogへの表示差異

    マルチスレッドでsleep()の時間を指定して動かすのを前提で、 Threadを継承した時は、時間通りに(リアルタイムで) eclipseのコンソールへ表示されるのですが、 Runnableをインプリメントしての動作では、 eclipseのコンソールに一瞬で表示されるのは何故でしょうか? public class MultiThread3 implements Runnable{ int time; MultiThread3(int time) { this.time = time; } public void run() { for(int i=0; i<5; i++) System.out.println("No."+i+":"+Thread.currentThread().getName()); try{ Thread.sleep(time); }catch (InterruptedException e) {} } } class MultiThreadTest3{ public static void main(String[] args) { MultiThread3 a = new MultiThread3(500); MultiThread3 b = new MultiThread3(700); MultiThread3 c = new MultiThread3(1100); Thread ta = new Thread(a); Thread tb = new Thread(b); Thread tc = new Thread(c); ta.setName("A"); tb.setName("\tB"); tc.setName("\t\tC"); ta.start(); tb.start(); tc.start(); } }

    • ベストアンサー
    • Java

専門家に質問してみよう