指定時間になってもブレイクしない

このQ&Aのポイント
  • 指定した時間になってもブレイクしない現象に遭遇しています。時間比較においてミリ秒の桁で誤差があることが原因と考えられます。
  • 問題のコードでは、指定した時間と現在の時間をミリ秒単位で比較していますが、時々誤差が生じてブレイクしない場合があります。
  • ブレイクさせるためには、より正確な時間比較の方法を使用する必要があります。例えば、Javaの`Instant`クラスや`java.util.concurrent.TimeUnit`クラスを使用する方法があります。
回答を見る
  • ベストアンサー

指定時間になってもブレイクしない

Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(time_parameter[0], time_parameter[1] - 1, time_parameter[2], time_parameter[3], time_parameter[4], time_parameter[5] + 10); Time = calendar.getTimeInMillis(); System.out.println("Time"+Time); for (;;) {   if (Time == System.currentTimeMillis()) {     System.out.println("break");     break;   } } このようにして指定した時間になったらブレイクさせようとしていますが 何度か実行していますが, ブレイクしない時がちょくちょくあります. Time = calendar.getTimeInMillis();と System.currentTimeMillis()を 表示させて見ましたが, どうやらミリ秒の桁で誤差があるようで ブレイクしません. 指定時間になったら確実にブレイクさせたいのですが, どうすればよいでしょうか?

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

条件を >   if (Time <= System.currentTimeMillis()) { にすればOKです。 ですが、もっと根本的な問題として、空ループを回すのはムダにCPUを消費するので良くありません。 Thread.Sleep を使いましょう。 for ループの代わりに > Thread.Sleep(Time - System.currentTimeMillis()); で十分です。

debukawa
質問者

お礼

回答ありがとうございます. 解決しました.有難うございました。

関連するQ&A

  • Javaについて、時間比較で処理をbreakしたいのですが、次のように

    Javaについて、時間比較で処理をbreakしたいのですが、次のように作ってみたのですが、endが解決できません。なにか手立てはないでしょうか? do {  //何か実行する。  long end = System.currentTimeMillis(); }while((end-start)<=60);

    • ベストアンサー
    • Java
  • プログラムの違いを教えて下さい・・・

    public class Gold1 { static int prime(int number){ int count=0; for(int i=2; i<number; i+=2){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; //System.out.println("4=2+2"); for(n=6; n<=100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ //System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } ---------------------------------------------------------------- この上のプログラムの一部を ---------------------------------------------------------------- if(prime(p)==0 && prime(n-p)==0){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } ---------------------------------------------------------------- というふうに変えたらどういう意味があるのですか??

    • ベストアンサー
    • Java
  • javaじゃんけんゲーの質問

    このjavaじゃんけんゲームで 0を押すまでじゃんけんが続いて0押したら終了して、終了と表示して、じゃんけんの勝敗が表示されるように作りたいんですけどどうしたらいいですか?教えてください import java.io.*; class kadai6 { public static void main(String args[]) throws IOException { System.out.println("これは、じゃんけんゲームです。"); System.out.println("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)さぁどれにしますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res =Integer.parseInt(str); switch(res){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("あなたの入力した値はエラーです。1~3の値を入力してください。"); System.exit(1); break; } int comp = (int)(Math.random()*3) + 1; switch (comp){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; default: System.out.println ("エラーです。"); break; } switch (res -comp) { case -2: System.out.println("コンピュータの勝ちです。"); break; case -1: System.out.println ("あなたの勝ちです。"); break; case 0: System.out.println ("あいこです。"); break; case 1: System.out.println ("コンピュータの勝ちです。"); break; case 2: System.out.println("あなたの勝ちです。"); break; default: System.out.println ("エラーです。"); break; } } }

  • Calendarオブジェクトにタイムゾーンの設定

    Calendarクラスで不思議に思ったことがあったので質問させてください。 下記サンプルのようにCalendarオブジェクトに対してタイムゾーンを設定しました。 表示1ではGMTタイム(9時間前の時間)が表示。 表示2では現在の時刻(設定したタイムゾーンを無視) して表示されてしまいます。これは仕様でしょうか。 JavaDocのなかで下記記述を見つけたのですがこの記述と関係ありますでしょうか。 いまいち文章が難解でよくわからないのですがgetメソッドなら計算した値 (この場合、タイムゾーンを反映して計算した値)を返しますよ と言っているのかなと 思ったのですが違いますでしょうか。 【JavaDocの記述】 「カレンダフィールド値は、set メソッドを呼び出して設定できます。 Calendar 内で設定されたフィールド値はすべて、その時間値 (「元期」からのミリ秒) または カレンダフィールドの値を計算する必要が生じるまで解釈されません。 get、getTimeInMillis、getTime、add、および roll の呼び出しでは、この種の計算が行われます。」 【サンプル】 Calendar cal = Calendar.getInstance(); cal.setTimeZone(TimeZone.getTimeZone("GMT")); //表示1 System.out.println(cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" +          cal.get(Calendar.DAY_OF_MONTH) + " " +          cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" +          cal.get(Calendar.SECOND)); //表示2 System.out.println(cal.getTime().toString());

  • Calenderクラスを使うと変?

    サーブレットで現在の日付と時刻を取得しようとして、まず、日付と時刻を表示させるプログラムを書きました。 APIドキュメントで探すとDateクラスのgetDate等が推奨されていないということだったので、Calendarクラスを使いました。 すると、月の表示がおかしいのです。年と日と時間はあっているのですが、月が10月になっているのです。(ちなみに今日なので、11月になるハズ・・・) パソコンの日付と時刻も今日(11月7日、タイムゾーン(GMT+09:00)大阪、札幌、東京)です。 そこで、DATEクラスを使うとちゃんと11月になっています。 どういうことなのでしょうか? import java.util.*; class Hiduke {    public static void main(String args[]) {      System.out.println(Calendar.getInstance());      Calendar calendar = Calendar.getInstance();      System.out.println(calendar.get(Calendar.YEAR));      System.out.println(calendar.get(Calendar.MONTH));      System.out.println(calendar.get(Calendar.DAY_OF_MONTH));      Date d = new Date();      System.out.println(d);    } } java.util.GregorianCalendartime=1036634060997,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null], firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2002,MONTH=10,WEEK_OF_YEAR=45,WEEK_OF_MONTH=2, DAY_OF_MONTH=7,DAY_OF_YEAR=311,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1, AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=54,SECOND=20,MILLISECOND=997,ZONE_OFFSET=32400000,DST_OFFSET=0] 2002 10 7 Thu Nov 07 10:54:21 JST 2002

    • ベストアンサー
    • Java
  • ゴールドバッハの予想について・・・

     ゴールドバッハの予想(4以上の任意の偶数は,2つの素数の和で表せる)を表すJavaプログラムを作りたいのですが、できるだけ計算経過時間を短縮したいんです。  下のプログラムを改善して、計算経過時間が速くなるようにして下さい。  どういう理由で改善したのかも付け加えてくれると嬉しいです。 -------------------------------------------------------------------------------------------------------------------------------- public class Gold { static int prime(int number){ int count=0; for(int i=1; i<=number; i++){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; for(n=4; n<100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } --------------------------------------------------------------------------------------------------------------------------------

    • ベストアンサー
    • Java
  • システム日付との比較

    始めたばかりで原因がわからず困っています。 以下のコードでコメント箇所を追加すると、 コンソール日付とシステム日付が一致しても正しい結果が 得られませんでした。 よろしくお願いします。 import java.util.*; import java.io.*; public class Test { public static void main(String[] args) throws IOException { System.out.println("年月日をそれぞれ入力して下さい。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); String str2 = br.readLine(); String str3 = br.readLine(); int intTmp1 = Integer.parseInt(str1); int intTmp2 = Integer.parseInt(str2); int intTmp3 = Integer.parseInt(str3); Calendar myCal = Calendar.getInstance(); myCal.set(intTmp1,intTmp2-1,intTmp3); System.out.println(myCal); //*コンソールで入力した日付を表示 Calendar myToday = Calendar.getInstance(); System.out.println(myToday); //*現在日付を表示 if(myToday.equals(myCal)){ System.out.println("入力したデータは現在日付と同じ日付です。"); }else{ System.out.println("入力したデータは現在日付とは違う日付です。"); } } }

  • switch文、break文と流れの制御について

    switch文、break文と流れの制御について JAVA超初心者です。よろしくお願いいたします。 只今、テキストを使って独学でJAVAを学習しておりまして、タイトルのような内容を学習しているところで、下記のようなプログラムが例題にありました。 ------------------------------------------ package chapter10; import lib.Input; public class Ex5{ public static void main(String[] args){ int n = Input.getInt(); switch(n){ case 1: System.out.println("1です"); case 2: System.out.println("2です"); case 3: System.out.println("3です"); default: System.out.println("それ以外です"); } } } ------------------------------------------ これを実行してみますと、breakの記載がないので、「1」を入力すると -------------------- 1です 2です 3です それ以外です -------------------- と全て表示されます。「2」を入力すると -------------------- 2です 3です それ以外です -------------------- と表示されます。 そこで質問です。 breakの記載がないので、ブロックから抜け出せないのはわかるのですが、入力した数字をcaseで判定し、caseの条件に当てはまった場合、何故それ以下のSystem.out.print()が全て実行されるのかわかりません。 私の解釈では、上記プログラムで「2」を入力した場合、JAVAは上から順に case 1 →『1ではないから実行しない』 (納得) case 2 →『2が入力されているから実行』 (納得) case 3 → ??? (入力されたのは2であり、3ではないから実行されないのではないか?) default → ??? (入力されたのは2であり、「それ以外」ではないから実行されないのではないか?) と思うのです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Javaによる現在時刻の表示について

    Javaで現在時刻を表示するプログラムを作りました。 今のままだと 2009/8/26(木) 15:8:7となり、 月日・時間分秒が一桁のときは前に0をつけて二桁(15:08:07のように)表示にしたいと思います。 何かいい方法はないでしょうか? if文で作成するとなると、かなりたくさんのコードを書かないといけない気がします。 良い案があれば是非ご教授頂ければと思います。 import java.util.Calendar; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Servlet_106 extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException{ res.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = res.getWriter(); String title = "現在時刻:"; Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DATE); StringBuffer dow = new StringBuffer(); switch (cal.get(Calendar.DAY_OF_WEEK)){ case Calendar.SUNDAY: dow.append("日"); break; ~~~(略)~~~ } int hour = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); out.println("<html lang=\"ja\">"); out.println("<head><title></title></head>"); out.println("<body>"); out.println("<p>現在時刻:" + year + "/" + month + "/" + day + "(" + dow + ")" + hour + ":" + minute + ":" + second + "</p>"); out.println("</body></html>"); out.close(); } }

    • ベストアンサー
    • Java
  • カレンダーの処理が分かりません

    休みの日を判定しようと思います。 土曜日か日曜日なら曜日を表示させるプログラムです。 2005/6/26日は日曜日なのですが「日曜日」と表示されません。どこがいけないのでしょうか? public void day() { Calendar calendar = Calendar.getInstance(); int y = 2005; int m = 6; int d = 26; calendar.set(y,m,d); // 日曜日のとき if(calendar.get(calendar.DAY_OF_WEEK) == calendar.SUNDAY){ System.out.println("日曜日"); } // 土曜日のとき else if(calendar.get(calendar.DAY_OF_WEEK) == calendar.SATURDAY){ System.out.println("土曜日 } }

    • ベストアンサー
    • Java