• 締切済み

applet

スレッドを使ってタイマーを作ろうと思っています。なぜか、ゆっくりとしかできないのですが・・。よろしくお願いします。 class TimerA implements Runnable { private boolean flg = true; private int time = 6000; public boolean isFlg() { return flg; } public int getTime(){ return time; } public void run() { for(;time > 0; time--) ; flg = false; System.out.println(time); } }

  • Java
  • 回答数2
  • ありがとう数0

みんなの回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.2

 以下のプログラムを実行してもらえばスレッドによるタイマの動作はわかると思います。 class TimerA implements Runnable { private boolean flg = true; private int time = 6000; public boolean isFlg() { return flg; }; public int getTime() { return time; }; public void run() { for(;time > 0; time--) try { Thread.sleep(1); } catch (Exception e) {};/*[1]*/ flg = false; System.out.println(time); }; } public class timer { public static void main(String args[]) { TimerA TimerRunnable = new TimerA(); Thread TimerThread = new Thread(TimerRunnable); TimerThread.start(); while (TimerRunnable.isFlg()) { try { Thread.sleep(100); } catch (Exception e) {}; System.out.println("Time=" + Integer.toString(TimerRunnable.getTime())); }; System.out.println("End of Main"); }; }  TimerAクラスは、下の方が言っているように、ビジーループ([1])の部分がおかしいにで書き直しましたが、 ほかは元のままです。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

ビジーループの使用はどんな場合にも根本的に間違っていますし、また、スレッドのタイトルは、もっと意味のあるタイトルにしてください。「applet」では、現在の読者に不親切であるばかりか、今後の検索の役に立ちません。

関連するQ&A

  • applet

    タイピングを作ってます。これだと、動くのですが入力することができません。どうしたらいいでしょうか。よろしくお願いします。 public void init() { setSize(300,300); setBackground(Color.MAGENTA); for(int i=0; i<26; i++) { chk[i] = 0; // 初期値入力 } flag = 0; // フラグの初期化 setLayout(new BorderLayout()); top = new Panel(); // パネル作成 top.setLayout(new GridLayout(3, 2)); top.add(question = new Label("タイピング 初級")); top.setFont(new Font("MS ゴシック",Font.ITALIC,18)); top.add(q_choice = new Choice()); top.add(stat = new Label("")); q_choice.add("基本"); // 選択ボックスにアイテム追加 q_choice.add("応用"); add(start_btn = new Button(" スタート ")); add(answer = new TextField()); answer.setFont(new Font("MS ゴシック",Font.BOLD,24)); add("North", top); add("South", start_btn); add("Center",answer); start_btn.addActionListener(new ActionListener() { //スタートボタンを押されたときの処理 public void actionPerformed(ActionEvent e) { // if (flag==0) { // flag = 1; typing(); // スレッド開始 // } } }); } public void typing() { TimerA runA = new TimerA(); Thread threadA = new Thread(runA); threadA.start(); boolean flg = true; int count = 0; if (q_choice.getSelectedIndex() == 0){ // 問題判定(指定された項目に一致する、リスト内の最初の項目を返します。) q_data = q_data1; mon = q_data1.length; } else { q_data = q_data2; mon = q_data2.length; } for (int i = 3; i > 0; i--) { // カウントダウン question.setText(""+i); } pt = 0; // 点数初期化 m = (int)(mon * Math.random()); // 1問目の問題決定 ランダムで question.setText(q_data[m]); question.setBackground(new Color(250,128,114)); // 背景色設定 stat.setBackground(new Color(0,206,209)); chk[m] = 1; // 問題のフラグを立てる while(count < 10) { // 問題をまわす time = 6000; if(q_data[m].equals(answer.getText())) { pt += (int)(10000 / (itime - time)); // 点数算出 while(chk[m] != 0) { m = (int)(mon * Math.random()); } chk[m] = 1; question.setText(q_data[m]); //answer.setFont(new Font("MS ゴシック",Font.BOLD,24)); answer.setText(""); } try { threadA.sleep(1000); } catch(InterruptedException e) {} flg = runA.isFlg(); if (flg == false){ count++; runA = new TimerA(); threadA = new Thread(runA); threadA.start(); time -= 10; } // time = runA.getTime(); stat.setText("残り時間 : "+(time/10)+"."+(time%10)+"秒 点数:"+pt+"点"); } question.setText("終了です!お疲れ様でした!"); stat.setText("Time Over! 点数:"+pt+"点"); } } class TimerA implements Runnable { private boolean flg = true; private int time = 6000; public boolean isFlg() { return flg; } public int getTime(){ return time; } public void run() { for(;time > 0; time--) ; flg = false; System.out.println(time); } }

  • 再度、スレッドが実行中かどうかの確認

    一度質問したことですが、再度質問させていただきます。 過去の質問は以下です。 http://oshiete1.goo.ne.jp/qa5528714.html 過去の質問を参考に、以下のように実装しました。 public class TEST{  public boolean testMe(){   Runnable runnable = /* 省略 */;   Thread thread = new Thread(runnable);   boolean alive = thread.isAlive();   /* 必ずfalseになってしまう */   if(!alive){    thread.start();    return true;   }   return false;  } } public class TEST2 implements Runnable{  public void run(){   /* 処理 */  } } 上記の通りだと「thread.isAlive()」が必ずfalseで返ってきます。 また、Executorを利用した実装も試しました。 /* 処理を省略 */ ExecutorService executorService = Executors.newSingleThreadExecutor(); Runnable runnable = /* 省略 */; // シャットダウン結果 boolean exeShutdown = executorService.isShutdown(); /* 一度シャットダウンすると、ずっとtrueになってしまう */ if(!exeShutdown){  // 実行  executorService.execute(runnable);  // シャットダウン  executorService.shutdown(); } 一度は実行されるのですが、 その後は「executorService.isShutdown()」がtrueしか返しません。 なので、一度しか実行できません。 再度、知恵を貸していただければと思います。 よろしくお願い致します

    • ベストアンサー
    • Java
  • Java言語のインタフェースについて

    Java言語を学習している者です。 インターフェースについて理解できずに困っております。 ここでは、Runnableインターフェースを例にとります。 (1)正しいコード public class ThreadTest implements Runnable { public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (1)のコードは正常に動きます。 (2)間違ったコード (implements Runnableを記述しなかった場合) public class ThreadTest{ public static void main (String args[]) { ThreadTest ins = new ThreadTest(); Thread th = new Thread(ins); th.start(); for(int i = 0; i < 10; i++) { System.out.println("main : " + i); } } public void run() { for(int i = 0; i < 10; i++) { System.out.println("run : " + i); } } } (2)のコードでは、 Thread th = new Thread(ins); で、 コンストラクタ―Thread(ThreadTest)は未定義です。 とエラーが出てしまいます。 確かに未定義なのですが、(1)でも定義していないように思えます。 Runnableインターフェースの働きのお陰だと言うことはわかるのですが、どういった働きによるものなのかがわかりません。 インターフェースのについて、 ・インターフェースのフィールドは必ず定数。 ・インターフェースのメソッドは必ず抽象メソッド。 ・インターフェースはインスタンスを作ることが出来ない。 ・抽象メソッドは必ず実装しなければならない。 は理解しているつもりです。 今回の質問をするに当たって、 RunnableのAPI http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Runnable.html を見たのですが、それでも理由が分からないので質問致します。 もし宜しかったら、APIの見方についてもコメントして頂けるとありがたいです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • アプレットで簡単な絵を描きたい

    drawLineメソッドを使用してマウスで絵を描きたいのですがうまくいきません。どうすればいいでしょうか? 一応私が途中まで考えたソースを下に載せておきます。 できればこのソースを変更して完成できればよく理解できるのでよろしくお願い致します。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class MyGraphics2 extends Applet implements MouseListener{ private int startX; private int startY; private int startX2; private int startY2; private boolean flg; public void init(){ addMouseListener(this); } public void mouseClicked(MouseEvent e){ } public void mousePressed(MouseEvent e){ flg = true; startX = e.getX(); startY = e.getY(); } public void mouseReleased(MouseEvent e){ flg = false; } public void mouseMoved(MouseEvent e){ System.out.println(flg); if(flg == true){ System.out.println(flg); startX2 = e.getX(); startY2 = e.getY(); repaint(); startX = e.getX(); startY = e.getY(); } } public void mouseEntered(MouseEvent e){} public void update(Graphics e){ e.drawLine(startX, startY,startX2, startY2); } public void mouseExited(MouseEvent e){} }

    • ベストアンサー
    • Java
  • java classの呼び出し方を教えて下さい。

    java classの呼び出し方を教えて下さい。 public class test extends Applet implements Runnable,ActionListener,KeyListener{ Thread th; // スレッド宣言 AudioClip IdoSound,KaitenSound,KesiSound,SetSound,CrySound; public void init(){ }   ・   ・   ・ public void test(){ ここで、最下欄の class stream{ public static void main(String args[]){ } を実行させたいのですが、記入方法が解りません・・・ } public int kesiOne(int VP,int HP){ }    ・    ・    ・ class stream{ public static void main(String args[]){ try{ File file = new File("c:\\java\\data.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println("12345"); pw.close(); }else{ System.out.println("ファイルに書き込めません"); } }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } } 解りにくい書き方で申し訳け有りませんが、宜しくお願いします。

  • NoSuchMethodErrorが解決できません。

    実行時エラーNoSuchMethodErrorが出て困っています。 どこを修正すればいいのでしょうか? class A implements Runnable{ int x; int y; public void run(){ for(int i = 0;i < 100;i++){ x++; y++; System.out.println("x="+x+"y="+y); } } } class B{ public static void main(String args[]){ new Thread(new A()).start(); new Thread(new A()).start(); } }

    • ベストアンサー
    • Java
  • Javaのプログラムの質問です。

    Javaのプログラムについての質問です。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。  注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中に番号を振ってあります。 import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; import java.util.List; class LocalList implements List{  private int Count;  private String Data[];  private Iterator ite;  private ListIterator lite;  // コンストラクタ  void mylist(){   Data = new String[10];   Count = 0;  }  (1)  public boolean add(Object str){   if(Count >= 10){    return false;   }   Data[Count ++] = new String((String)str);   return true;  }  public void add(int i,Object str){  }        public boolean addAll(Collection c){   return false;  }        public boolean addAll(int i,Collection c){   return false;  }    (2)  public void clear(){   Count = 0;  }  public boolean contains(Object str){   return false;  }          public boolean containsAll(Collection c){   return false;  }  public boolean equals(Object str){   return false;  }    (3)  public Object get(int i){   return (i >= Count);  }  public int hashCode(){   return -1;  }  public int indexOf(Object str){   return -1;  }  public boolean isEmpty(){   return false;  }  public Iterator iterator(){   return ite;  }     public int lastIndexOf(Object str){   return -1;  }     public ListIterator listIterator(){   return lite;  }     public ListIterator listIterator(int i){   return lite;  }    (4)  public Object remove(int i){   return (i >= Count);  }    public boolean remove(Object str){   return true;  }         public boolean removeAll(Collection c){   return false;  }         public boolean retainAll(Collection c){   return false;  }    (5)  public Object set(int i,Object str){   return Data[i];  }    (6)  public int size(){   return Count;  }  public List subList(int i,int j){   return this;  }  public Object[] toArray(){   return Data;  }  public Object[] toArray(Object[] a){   return Data;  } } class Main {  public static void main(String[] args) {   mylist sub = new mylist();   sub.add("ビルドバーニングガンダム");   sub.add("ライトニングガンダム");   sub.add("ウイニングガンダム");   sub.add("ガンダムフェニーチェリナーシタ");   sub.add("R・ギャギャ");   for(int i = 0; i < sub.size(); i++){      System.out.println(sub.get(i));   }   // 改行   System.out.println();   // setメソッド   sub.set(1,"ガンダムエピオン");   for(int i = 0; i < sub.size(); i++){    System.out.println(sub.get(i));   }   // 改行   System.out.println();   // sizeメソッド   System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n");   // removeメソッド   sub.remove(1);   for(int i = 0; i < sub.size(); i++){       System.out.println(sub.get(i));   }   // clearメソッド   sub.clear();   System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです");    } } setメソッドとremoveメソッド以外は起動するのようになったのですが、この2つがうんともすんとも動きません。ジェネリクス型を使うという考え方もあるらしいのですが、ネットで調べてもピンと来ず寸詰まり状態になってしまっています。後少しだと思うのですが。。。。 どなたかご教授頂けないでしょうか?よろしくお願い致します。

  • 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
  • ServletContextLisntener#contextDest

    ServletContextLisntener#contextDestroyedついて 下記の様なコードがあったとします。 Tomcat上で動くServletContextListenerImpl#contextDestroyed内の処理にて ポイント1とポイント2を確実に通過するには どのような設定orコーディングが必要ですか? ※宿題ではありません。月曜に製造完です。(..); class ThreadManager {   private static final ThreadManager manager = new ThreadManager();   private final Thread t;   private boolean isStop;   pulbic ThreadManger () {     isStop = false;     final Thread t = new Thread () {       public void run () {         for ( ; ! this.isStop ; ) {           Thread.sleep(300000);         }       }       //ポイント1     }     t.start();     this.t = t;   }   public static ThreadManager getInstance () {     return manager;   }   public void stop () {     this.isStop = true;   }   public void isAlive () {     return this.isAlive();   } } public class ServletContextListenerImpl implements ServletContextListener {   public void contextInitialzed () {}   public void contextDestroyed () {     final ThreadManager manager = ThreadManager.getInstance();     manager.stop();     while (manager.isAlive()) {       //Thread.sleep(2000)する     }     //ポイント2   } }

    • ベストアンサー
    • Java
  • マウスクリックで別のスレッドを動かしたい

    うまく動きません、どなたかご教示下さい(文字数が不足です) ===== public class ImgMove3 extends Applet implements Runnable , MouseListener { private int width , height ; private Thread th1 /*, th2*/ ; private boolean bLoopEnd = false ; private int x1 = 30 , y1 = 100 ; // private int x2 = 80 , y2 = 150 ; Image img1 , img2 ; AudioClip sound ; private int vx1 = 3 , vy1 = 2 ; // private int vx2 = 1 , vy2 = 1 ; Dimension d ; public void init() { d = getSize() ; width = d.width ; height = d.height ; this.addMouseListener(this) ; this.addMouseListener(new MyImage3(this)) ; img1 = getImage( getDocumentBase() , "ambulance.jpg" ) ; img2 = getImage( getDocumentBase() , "firecar.jpg" ) ; sound = getAudioClip( getDocumentBase() , "UFO.wav" ) ; } public void mouseEntered( MouseEvent e) { sound.play() ; } public void mouseClicked(MouseEvent e) { } public void start() { if(th1 == null) { th1 = new Thread(this); th1.start(); } } public void stop() { if( th1 != null ) { th1 = null ; } } public void run() { while(bLoopEnd == false) { move() ; repaint() ; try{ Thread.sleep( 10 ) ; } catch (InterruptedException e ) {} } } private void move() { if( x1 >= width - 130 ) { vx1 =- vx1 ; } if( y1 >= height - 110 ) { vy1 =- vy1 ; } if( x1 < 0 ) { vx1 =- vx1 ; } if( y1 < 0 ) { vy1 =- vy1 ; } } public void update( Graphics g1 ) { paint( g1 ) ; } public void paint( Graphics g1 ) { g1.drawImage( img1 , x1 , y1 , this ) ; } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e){ } } //======================================================================= class MyImage3 extends Applet implements Runnable , MouseListener { private int width , height ; private Thread th2 ; private boolean bLoopEnd = false ; private int x2 = 80 , y2 = 150 ; Image img2 ; AudioClip sound ; private int vx2 = 1 , vy2 = 1 ; Dimension d ; Image firecar ; ImgMove3 imv3 ; public MyImage3(ImgMove3 app) { imv3 = app ; imv3.img2 = getImage( getDocumentBase() , "firecar.jpg" ) ; } public void mouseEntered( MouseEvent e) { imv3.sound.play() ; } public void mouseClicked(MouseEvent e) { Graphics g1 =getGraphics(); g1.drawImage( img2 , x2 , y2 , this ) ; imv3.repaint(); } public void start() { if(th2 == null) { th2 = new Thread(this); th2.start(); } } public void stop() { if( th2 != null ) { th2 = null ; } } public void run() { while( th2 != null && bLoopEnd == false) { move() ; imv3.repaint() ; try{ Thread.sleep( 10 ) ; } catch (InterruptedException e ) {} } } private void move() { if( x2 >= width - 130 ) { vx2 =- vx2 ; } if( y2 >= height - 110 ) { vy2 =- vy2 ; } if( x2 < 0 ) { vx2 =- vx2 ; } if( y2 < 0 ) { vy2 =- vy2 ; } x2 += vx2 ; y2 += vy2 ; } public void update( Graphics g1 ) { imv3.paint( g1 ) ; } public void paint( Graphics g1 ) { g1.drawImage( img2 , x2 , y2 , this ) ; } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } }

    • ベストアンサー
    • Java

専門家に質問してみよう