• ベストアンサー

Thread とか Sleep とかについて質問です。   Javaで

Thread とか Sleep とかについて質問です。   Javaでトランプゲームを作ってます。例えば、コンピュータの番で5枚のトランプをめくる間隔を1枚0.5秒くらい間隔でやらせる為には、Thread.sleep(500); を使えばいいんでしょうか? 普通にやると当然一瞬でめくってしまう為、時間かせぎをしたいのです。VB系をやってた時は、コードの中にSleep(500)を好きな場所に入れれば、簡単に出来てたのですが。Javaでは上手くいかなくて・・・。よろしくお願いします。 (オセロで1枚1枚ひっくり返す時とかもめくる間隔を空けたいです)

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  Swing を使っているのなら、javax.swing.Timer、Awt を使っているなら、java.util.Timer を使うのが一般的かと思います。  普通にイベント内で、sleep を使ってしまうと、実際の描画は、イベントが終了した後にまとめて行われるので、いっぺんにめくれたように見えてしまいますよ。

meguchopin
質問者

お礼

返事が遅くなりました。。。 Sleepではダメなんですね。 Timerでやってみます。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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
  • Threading.Thread.Sleep()の前後の処理

    初めて質問します。(VB2008始めたばかりの初心者です) 昔のBASICでwaitやdelay、sleepなどといったプログラムの実行を一時止めることの出来るコマンドがあったと思いますが、 VB2008上で同じようなことさせてラベルの色を一定時間で変化させたいと思い、色々調べて Threading.Thread.Sleep()  というものを見つけました。実際使ってみるとThreading.Thread.Sleep()の前に書いた処理がうまく動作しません。 (下記のような簡単なコードですが) Private Sub Buttonstart_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles Buttonstart.Click    Label1.BackColor = Color.White     Threading.Thread.Sleep(2000)     Label1.BackColor = Color.Blue End Sub スタートボタンを押せばlabel1が白色になり2秒後に青にしたいのですが白色にならずに2秒後にいきなり青になってしまいます。 とても初歩的な間違いをしていると思うのですが解決できません。恥ずかしいと思いながらも質問させていただきます。アドバイスをお願いします。

  • C++ Thread::Sleep()について

    RunTimer = gcnew Timer(); RunTimer->Interval = 50; RunTimer->Tick += gcnew EventHandler(this, &RunTick); RunTimer->Enabled = true; ・・・処理・・・ RunTimer->Enabled = false; System::Threading::Thread::Sleep(1000); としているのですが、数コマ動いてしまいます。 処理は3枚の画像を差し替えて動かしているのですが、即座にスリープがかからず、 画像が少し歪んでしまいます。 ソースが長く、どこを記載すれば良いのか解らず、かなり抜粋しましたが、 TimerのTickで画像を入れ替えて、歩いている様にみせかけています。 一時停止後、改めて処理を始めようと思っているのですが、 なぜだか、少し動いてしまします。 Sleepを削除すると、うまく止まるのですが、即座に次の処理に移行してしまう為、数秒停止させたいと考えています。 System::Threading::Thread::Sleep(1000); だけでは、即座に止める事はできないものでしょうか? また、TimerのTickを数秒止める事はできるものでしょうか? ご存じの方、アドバイスよろしくお願いいたします。

  • スレッドについての質問です。

    下記のロジックを見ていただきたいのです。 スレッドがnullの間はrunが動いています。 問題は一番下に記載した"stopplay()"というメソッドだと思われます、スレッドを停止して直ぐにまた動かしていますがどうもスレッドが二つ動いている様子です。なぜでしょうか? ************************************************** //最初にスレッドを開始します。 public init(){ play(); } ************************************************** //スレッドのON OFF public void threadOnOff(boolean sw) { if(sw == true){ thread =new Thread(this); thread.start(); } else { thread = null; } } ************************************************** //スレッド開始 public void play(){ threadOnOff(true); } ************************************************** //スレッド停止 public void stop(){ threadOnOff(false); } ************************************************** //runメソッド  public void run(){ String mode = ""; while(thread != null){ try { thread.sleep(500); //0.5秒間隔で動きます。 mode = modeRequest(); if(mode.startsWith("STOP") == true) { //スレッド停止 threadOnOff(false); } } catch (InterruptedException ie) {} } } ************************************************** //問題のメソッドです。 public void stopplay(){ stop(); play(); }

    • ベストアンサー
    • Java
  • javaのスレッドの割込みについて

    javaのスレッド割込みに関する初心者の質問です。 割込みの発生元でCNTに値を設定し、割込みの受信元でCNTの値を読込み、表示しています。 下記のコードを参照ください。 Q1)CNTの値の設定と読込みで競合が発生する様なことはありませんか? 又は、処理が停滞するとか 以上、お手数をお掛けしますが、宜しくお願いします。 //割り込を発生するスレッド class threadA extends base{ private Thread target; public threadA(Thread targetA){ target = targetA; } public void run(){ for(int i = 0; i < 8;i++){ try{ System.out.print("."); Thread.sleep(1); CNT=i; target.interrupt(); }catch(InterruptedException e){ System.out.println("今割り込まれました: thread"); } } } } //スレッドからの割り込みを受信するルーチン class Sample108{ public static void main(String args[]){ //for(int i=0; i<2; i++){ classA obj = new classA(); obj.threadStart();//割り込みを受けるルーチン、この中で、割り込みを発生するルーチンを起動している //} } } //割り込みを受けるルーチン class classA extends base{ void threadStart(){ System.out.println("Start: main****"); threadA obj = new threadA(Thread.currentThread()); obj.start(); //Thread起動 //mainのルーチン for(int j = 0;j < 20; j++){ try{ Thread.sleep(1); System.out.print("*"); }catch(InterruptedException e){ System.out.println("今割り込まれました: classA CNT="+CNT); } } } } 以上

    • ベストアンサー
    • Java
  • スレッド制御に関して

    C言語の初心者です。 現在、スレッドの勉強をしております。 最近、pthreadをなんとなく理解しつつありますが、 下記の2点に関して試行錯誤しております。 (1)スレッドを周期的に起動したい (2)時間によって起動したい (1)は、例えば30秒毎にスレッドを起動させたい等といった、周期スレッドの生成方法です。今考えているのは、スレッドを生成後、スレッド生成元で30秒間sleepして、2回目のスレッドを起動…。といったイメージを考えております。 (2)に関しても同様で、例えば12時00分00秒にスレッドを生成したいというパターンで、スレッド生成元にて、時間を取得して、その時間が12時00分00秒であればスレッド生成を行うといったイメージを考えております。 上記2案とも初心者なりに考えた案なのですが、他によい案はありませんでしょうか? ご教授頂けますようよろしくお願いいたします。

  • Javaアプレットで複数のスレッド (初心者です)

    javaアプレットで二つのスレッドを作り、それぞれからパラパラアニメ(0.4秒間隔で絵が変わるものanime1と0.7秒のものanime2)を表示させたいと考えています。 パラパラアニメ本体はhttp://www.ipc.hokusei.ac.jp/~z00104/java/anim.htmlをほぼコピーで使わせてもらい、それ単体では動かせました。 しかし二つスレッドを作るためにRunnableを実装したクラスを二つ用意して、それをまた別の一つのクラスから呼び出すことがうまくできません。 public class oshietegoo extends Applet{ anime1 aa = new anime1(); anime2 bb = new anime2(); Thread a = new Thread(aa); Thread b = new Thread(bb); a.start(); b.start(); //(スレッドの作成についてはhttp://www.tohoho-web.com/java/thread.htmを参考にしました) } class anime1 extends Applet implements Runnable{ 【中身は最初のURLのコピー】 } class anime2 extends Applet implements Runnable{ 【中身は最初URLのコピー】 } というように書いているのですが、a.start();とb.start();のところで「トークン "start" に構文エラーがあります。このトークンの後には Identifier を指定する必要があります」とエラーが出てしまいます。 色々と調べたり、インスタンスやクラスなど基本的な概念を勉強したりしたつもりなのですが、なぜエラーが出るのか分かりませんでした……。 どなたか解決法を教えていただけませんでしょうか? 初心者な質問で申し訳ないのですが、お力添えいただけると助かります。 不足があれば追記いたしますので、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • ワーカスレッドAfxBeginThreadのスレッド起動を遅延させたい

    アラーム情報などをBASP21を用いてE-Mail送信するプログラムを マルチスレッドにしていました。 自己メールサーバーを立てていた場合は、1秒間に何件でもセッション 張ってもよかったのですが、訳あってOCNのメールサーバーを使うように したところ、1秒間に複数のセッションを張ると迷惑メール送信 と認識されるため、接続が拒否されていまいます。 そこで、マルチスレッド化しているアラームメールの起動間隔を伸ばす ためにAfxBeginThreadの後に Sleep( 5* 1000 ); を入れて1秒間に複数送信しないようにしたつもりなんです が、何故かSleepが効かな状況です。 エラー内容としては、次のように表示されます。 Too Many Session 421 細かく見ていくと、状況によって次のエラーでした。 http://homepage1.nifty.com/yito/anhttpd/winsock_error.html 10060 WSAETIMEDOUT 10061 WSAECONNREFUSED Connection refused ログを見てもスリープが効いておらず、間隔なしにアラームメールが 1秒間に10件近く送信されてしまいます。 一応渡されたスレッドの最後に AfxEndThreadを書いてみたり書かないようにしてみたんですが、 状況は変わらずです。 #include "stdafx.h" #include "windows.h" for( i=0;i<ALARM_MAX;i++ ){ m_pThreadCL[i] = AfxBeginThread(ThreadProcCL, (LPVOID)i,THREAD_PRIORITY_NORMAL) Sleep( 5 * 1000); //::Sleep( 5 * 1000 );の間違い? } 念の為 スレッド起動をしなければいいのですが、単純にはいかなかった ため、応急処置としてスレッドの起動間隔を遅延させる方法を どうにかできないものでしょうか。あくまでも応急処置として、 お願いいたします。

  • JAVAのお勧めの本(中級)

    JAVAでの初級の本を何冊か買い初級レベル(継承、インターフェイス、スレッド等)は理解したつもりです。 ほんとに簡単なプログラムは本を見ながらですが作れるようになりましたが、次のステップに進む為のJAVA本でお勧めのものがありましたら教えていただけないでしょうか? 今はSQLserver、VB、ASP、LotusNotes等のプログラマーをしています。 データベース系を扱うものが多いので、Javaでデータベースを扱うほうが理解がはやいかな…と思っています。 宜しくお願いします

    • ベストアンサー
    • Java
  • パソコンが勝手にスリープモードになります。なぜ?

    パソコンが勝手にスリープ状態になります。なぜでしょうか? シャットダウン状態、またはスリープ状態からパソコンを立ち上げて20~30分ほどの間、頻繁に勝手にスリープ状態になってしまいます。 画面が一瞬真っ黒になり、その直後になります。再立ち上げしてもすぐにスリープ状態になります。ひどい時は立ち上がりきらないうちにスリープ状態になります。30分ぐらい経過すると、次第に発生頻度が減り安定してきます。 「電源オプション」→「詳細設定」で、「ポータブル コンピューターを閉じたとき」の項目を、「スタンバイ」から「何もしない」に変更したところ、画面が一瞬真っ黒になってもスリープ状態になることなく動くようになりましたが、このまま使い続けて大丈夫でしょうか? 今のところ、保存しているデータが壊れるといった実害はでていませんが…。OSはXPのSP3です。