無限ループをわざと作って時計を作ろうと思っています。
while(true){
処理
}
とすると無限ループを作ることができると書いてありましたので
private void btnRedActionPerformed(java.awt.event.ActionEvent evt) {
while(true) {
taOutput.setText("");
Date d = new Date();
taOutput.append(d +":" );
Color c = new Color(102,255,255);
taOutput.setBackground(c);
Font f = new Font(Font.SERIF, Font.ITALIC, 25);
taOutput.setFont(f);
}
}
として実行してボタンを押すと処理が止まって固まってしまうのです。
出力画面にOutOfMemoryErrorと書いてあるのでそのへんの理由だと思うのですが。
ちなみに
for (int i = 0; i<5; i++) {
}
でテストするとうまく動きます。
これを固まらせずにうまく無限ループを続けさせるにはどうしたらいいのでしょうか。
No.3ベストアンサー
- 回答日時:
無限ループを使用することについては意見が分かれるところかと思いますが、私は、ちゃんとThread.sleep(n)を呼び出してやれば、それほどCPUにも負担をかけないと思っています。
まあ、javax.swing.Timerを使う方がスマートではありますが。でも、メインスレッドの中で、無限ループを使うのは、やはり絶対に駄目です。理由はrinkunさんのおっしゃる通りです。
メインスレッドは一仕事終えて落ち着くまで、描画をしてくれないのです。
以下にThreadと無限ループを使った場合の例を挙げておきます。
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class WhileTest extends JFrame implements ActionListener {
JButton btn;
JTextArea taOutput;
public static void main(String[] args){
WhileTest f=new WhileTest();
f.setSize(400, 300);
f.setVisible(true);
}
public WhileTest(){
Container cp=getContentPane();
cp.setLayout(new BorderLayout());
btn=new JButton("start");
btn.addActionListener(this);
taOutput=new JTextArea();
cp.add(btn, BorderLayout.NORTH);
cp.add(new JScrollPane(taOutput), BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent evt) {
TimerThread t=new TimerThread();
t.start();
}
class TimerThread extends Thread{
public void run(){
while(true){
Date d = new Date();
taOutput.setText(d +":" );
try{
Thread.sleep(100);
}catch(InterruptedException ex){
}
}
}
}
}
No.4
- 回答日時:
> ちゃんとThread.sleep(n)を呼び出してやれば
Thread.sleep()は、スレッドのスケジューリングを放棄しないから、厳しい条件ではだめですよ。javax.swing.Timerのソースコードを見ると、良い勉強になります。また、別スレッドからGUIのコードを呼ぶときは、やはり厳しい条件のときにはinvokeLater()やinvokeAndWait()をかませる必要があります。初心者も、そのことは知っておくべきです。
No.2
- 回答日時:
javax.swig.Timerを使ってください。
無限ループは、CPUのサイクルを浪費する極悪人です。ゼッタイに使ってはいけません。rinkun氏案の別スレッドも、無限ループの中で生成するのならノーグッド!です。参考URL:http://java.sun.com/javase/ja/6/docs/ja/api/java …
No.1
- 回答日時:
画面の表示はどこで更新しているのかな?
通常、GUIフレームワークでの画面の更新などはコールバック・メソッド(btnRedActionPerformedなど)を抜けた後でフレームワークから画面更新メソッドを呼び出して行っています。
ところがコールバック・メソッドの中で無限ループしてしまうとコールバック・メソッドは終了せず、画面の更新などは一切されなくなってしまいます。
実際のところフレームワークは画面の更新だけでなく、イベント処理なども行っていますので、無限ループするならループの中で一連の処理を行わなければいけません。VBではイベント処理を呼び出すDoEventsがありますが、Javaでは知りません。基本的にはコールバック・メソッドの中では無限ループをしないことです。
どうしても無限ループ処理をしたい場合は、別スレッドを起動して行いましょう。そうすればコールバック・メソッドはスレッドを立ち上げてすぐに終わりますのでイベント処理には問題ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tryの終了
-
Java
-
JavaScriptからJAVAクラスを呼...
-
doGetとdoPostの違い
-
javascriptの繰り返し処理が終...
-
ユーザー名とテキストフィール...
-
ServletからJSPに遷移させた後...
-
java(swing)で、登録ボタンを押...
-
ブラウザを閉じた後のサーバ側...
-
Javaの再帰でメソッド呼び出す...
-
flush()メソッドについて・・・
-
数値の定数を付ける時
-
スレッド1とスレッド2を交互に...
-
「UIスレッド」「マルチスレッ...
-
データ未入力時のエラー処理が...
-
処理実行後、終了させないで最...
-
Javaでのデバッグコード削除
-
PHPでDB処理中にプログレスバー...
-
バッチ処理をJavaで
-
重たい処理のタイムアウト強制終了
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
doGetとdoPostの違い
-
Javaプログラムからポップアッ...
-
SwingUtilities.invokeLater(ne...
-
Javaでのデバッグコード削除
-
Tomcat高負荷時の設定について
-
JavaScriptからJAVAクラスを呼...
-
データ未入力時のエラー処理が...
-
アコーディオンメニューをアン...
-
ブラウザを閉じた後のサーバ側...
-
[Java] while(true)の意味
-
数値の定数を付ける時
-
Javaアプリケーション実行の返...
-
ラジオボタンの選択判定
-
onBlurとonFocusの処理順序につ...
-
スレッド1とスレッド2を交互に...
-
WPF C#でF10のイベント取得方法...
-
flush()メソッドについて・・・
-
ExcelVBA で文字列の特定の文字...
-
無限ループをわざと作って時計...
おすすめ情報