• 締切済み

javaでアプレットを使用していますが、

javaでアプレットを使用しています。 startメソッドでkicker.start();しているのに、 stopメソッドではkicker=null;はしているものの、 kicker.stop();は推奨されていません。 これで開始されたスレッドが停止するのでしょうか?

みんなの回答

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

> blinker == thisThread > > がよくわかりません あー……すみません。自分の先の回答、あなたの質問文に出てこないコードがいきなり出てちょっと混乱するかもしれませんね。 blinker == thisThread というコードは自分が提示した「Java 推奨されないスレッドプリミティブ」というページの「Thread.stop の代わりに何を使うべきですか」という見出しのところにあるコードが元です。自分の回答の後半は、なぜこのコードでスレッドが止まるのかということについての説明です。 > public void run() { > Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3); > while(kicker != null) { > repaint(); > try { > Thread.sleep(100); > } catch(InterruptedException e) {} > } > kicker=null; > } > > この止め方はどうですか? はっきり言ってkicker=nullを入れた位置が無意味です。 なぜなら、whileループが終わったときkickerはすでにnullになっており、そこにnullを再度代入しているからです。 逆に、何らかの手段でwhileループの継続条件であるkicker != nullを偽にしないと、whileループは延々と回り続けることになり、run()メソッドが終了しないためこのスレッドは止まりません。

maiko0318
質問者

補足

再度すいません。 では、最初からこうすればよかったですね。 public void run() { Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3); while(kicker != null) { repaint(); try { Thread.sleep(20); } catch(InterruptedException e) {} } kicker=null;  //コレは不要 } public void update(Graphics g){ paint(g); } public void start() { if(kicker == null) { kicker = new Thread(this); kicker.start(); } } public void stop() { if(kicker != null) { //削除 kicker.stop(); kicker = null; } } で良いということですね。

全文を見る
すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

kicker のクラスがなんなのかわかりませんが、スレッドと言っていてstop()メソッドが非推奨ということからThreadクラスを派生したものでしょうか? とりあえず上記の通りであると仮定して回答……しようとしたら公式のほうにstop()が非推奨な理由とその代わりにどう変更すべきかが書かれています。 http://docs.oracle.com/javase/jp/6/technotes/guides/concurrency/threadPrimitiveDeprecation.html (表示が乱れる場合は表示エンコードをUnicode UTF-8にしてください) ひょっとしたらすでにこちらを参照されてkicker=null;とされている上でのご質問かもしれませんね。 その場合の答は、ええ、上記の代入「だけ」ではスレッドは止まりません。 上記ページの変更前と変更後をよく見てください。stop()以外にrun()にも修正が入っています。 この変更、whileの持続条件がtrueからblinker == thisThreadに代わっていることと上記の代入とが合わさることでrun()の処理(つまりスレッド処理)を止めることができます。 このサンプルコードでスレッドが動き続けるのはwhileの持続条件が成り立ち続けているためです。 変更後ではここでwhileに入る前のblinkerであるthisThreadと現在のblinkerとを比較しています。 どこかからstop()が呼ばれるまでblinkerの値はthisThreadと一致するため、この比較は一致しwhile内の処理が実行されます。 一方、いったんstop()が呼ばれるとblinkerの値はnullになりthisThreadと一致しません。したがって、whileの次の処理を行いますが、この場合は直後でメソッドが終了しているためrun()メソッドが終わります。 まとめると、スレッドを止めるには ・何らかの終了指示フラグをスレッド実行側に持たせる ・スレッド実行側ではスレッド実行中に適切な間隔で終了指示フラグを確認する ・外部から止めるには終了指示フラグをオンにする事だけを行う。外部からスレッドを無理やり止めてはいけない。 ということを実装する必要があります。サンプルコードの例では終了指示フラグとしてblinker自体を使っているだけです。Threadクラスのインスタンスの参照を外すとそのスレッドの処理が終了することは決してありません。

maiko0318
質問者

補足

すいません。もう1つ突っ込んでおねがいします。 blinker == thisThread がよくわかりません。 run()は次のようになっています。 public void run() { Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3); while(kicker != null) { repaint(); try { Thread.sleep(100); } catch(InterruptedException e) {} } kicker=null; } この止め方はどうですか?

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

関連するQ&A

  • Javaアプレットとマルチスレッドの組み合わせ

    Javaアプレットとマルチスレッドを組み合わせてパラパラ漫画のようなものを作りたいのですがうまくいきません。 import java.awt.Graphics; import java.awt.Image; public class kadai4 extends java.applet.Applet implements Runnable{ Image logoImage[]; Thread runner; int current; int last=6; public void init(){ logoImage=new Image[last]; for(int i=0;i<last;i++){ logoImage[i] = getImage(getCodeBase(),"image/logo" + (i+1) + ".gif"); } } public void start(){ if(runner == null){ runner = new Thread(this); runner.start(); } } public void stop(){ if(runner != null){ runner.stop(); runner=null; } } public void run(){ while(true){ for(int i=0;i<last;i++){ current=i; repaint(); pause(400); } } } public void paint(Graphics g){ g.drawImage(logoImage[current],50,25,50,50,this); } void pause(int time){ try { Thread.sleep(time);} catch (InterruptedException e) {} } } これを実行すると推奨されない API を使用またはオーバーライドしています。というエラーが発生するのですがどうすれば良いでしょうか?他の方法でも構いません

    • ベストアンサー
    • Java
  • JAVAでアプレットをつくりたいのですが

    コマンドプロンプトで命令して、Hello worldのように文字をコマンドプロンプト上に出すことはできたのですが、アニメーションなのどのアプレットを出そうとすると Exception in thread "main"java.lang.NoSuchMethodError:main とでてしまいます。ある研究室で公開されているソースファイルを使い、球がスタート、ストップボタンで動くアプレットなのですが、何か出力表示するための別のソフトが必要なのでしょうか?ちなみにJDK1.3.1を使用しています。初心者なので専門用語の使い方がおかしい所がありましたら申し訳ありません。どうぞ宜しくお願いいたします。

    • ベストアンサー
    • Java
  • thread.stop()について

    こんにちは。お願いします。 javaのプログラミングについては、殆ど分かりませんが、 フリーのアプレットをダウンロードして、使用してます。 スクロールする速度などだけをカスタマイズしたいのです。 JAVAファイルもダウンロードできるようになっていますが、 JDK バージョン 1.1以前の設計なようで、 それで、コンパイルすると、以下のエラーが出ます。 警告: java.lang.Thread の stop() は推奨されません。 thread.stop(); stop()について、どう変更したらいいのでしょう。 javaファイルは、 /********** start **********/ public void start() { thread = new Thread(this); thread.start(); } /********** stop **********/ public void stop() { thread.stop(); thread = null; } このようになっていますが、 http://java.sun.com/j2se/1.3/ja/docs/ja/guide/misc/threadPrimitiveDeprecation.html を参考に、 thread.stop(); を削除しようかとも思いましたが、ちょっと怖いですし、 どうぞ、お願い申し上げます

    • ベストアンサー
    • Java
  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • Javaアプレットが読み込めない

    Javaアプレットを作って、インターネットエクスプローラで表示させようとすると 「Javaアプレットの読み込みに失敗しました」 とでて表示できません。 また、appletviewerでも 「start:アプレットは初期化されていません」 と出て表示できません。 (WindowsXPのコマンドプロンプトで) どうすればいいのでしょうか? 両方の解決法を教えてください。

    • ベストアンサー
    • Java
  • Javaアプレットビューワー

    Javaでアプレットビューワーを使用した際、 java.lang.ArrayIndexOutOfBoundsException: 108 at moji.cntpix(moji.java:80) at moji.init(moji.java:41) at sun.applet.AppletPanel.run(AppletPanel:424) at java.lang.Thread.run(Thread.java:619) とでたのですがどういう意味なのでしょうか? 教えてくださいお願いします。

    • ベストアンサー
    • Java
  • スレッドについての質問です。

    下記のロジックを見ていただきたいのです。 スレッドが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
  • アプレット(アニメーション)

    勉強していて、よくわからなくなってきたので教えてください。 アニメーションのためにスレッドを動かしますよね。 本によって開始の仕方が違うのに説明があまり書いていなくて… init() のなかから Thread th=new Thread(this); th.start(); とするのと、 start() のなかから th=new Thread(this); th.start(); (thはinit()の中で宣言済み) とするのでは何が違うのでしょう? それに、startメソッドの中から、startメソッドを呼ぶって・・・・どういうこと・・・??? startメソッドが呼ばれるとrunが呼ばれるんですよね… runを直接呼んではいけないのでしょうか??

    • ベストアンサー
    • Java
  • アプレットとボタン

    今現在アプレットについて勉強しているものです。 少し行き詰っているので助けてもらえるとありがたいです。 今アプレットのキャンバスを使い時計と作ろうとしています。 ですがただの時計(スレッドでやるお決まりの時計)は出来るのでGUIのボタンを少しつかってみようと思い、 「ボタンが押されてから時計がスタートする」というものを作ろうとしました。 そこで考えたのが、まずボタンとキャンバスを作っておいて、 ボタンが押されたら、ActionPerformedのメソッド内でスレッドを作成して、 キャンバスの時計を進めるという方法なのですが どうしてもキャンバスのインスタンスを作成した瞬間に、 キャンバスのpaint()が呼ばれて、時計が少し進んでしまいます。 完全にボタンを押した後に、キャンバスが呼ばれ、paint()もそこからスタートするようにするにはどうしたらいいでしょうか? 要するに、Appletのpaintメソッドをボタンが押された後に始めて動くようにしたいのです;;

  • java アプリケーションをjava アプレットに

    java超初学者です。詳しいかたご教授願います。 java アプリケーションをjava アプレットに書き換えたいのですが、具体的にはどう書き換えを行ったらいいのか修正をお願いします。 (文字制限があるので、14個あるクラスファイルの中で(内1つはhtmlファイル)、メインメソッドを持つ実行クラスだけのせています。) Appletを継承させる、属性をメインクラスとコンストラクタはpublic にする、 mainメソッドを削除し、initメソッドへ書き換える、サイズ指定は<applet>タグで指定する。等調べましたが 具体的にわかりません。特にコンストラクタとメインメソッドの部分のアプレットへの書き換えがわかりませんでした。 宜しくお願い致します。 //実行クラスです。 import java.awt.*; import java.awt.event.*; /** *ゲームクラス(ここから始まる)<p> *画面の作成 */ public class Game extends Frame { /** * メインクラス */ public static void main(String args[]) { //フレームの作成 new Game(); } /** * 引数なしのコンストラクタ */ Game() { //*** ウィンドウの初期化 //タイトル super("Shooting Game"); //クローズボタンによる終了処理の実装 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); setSize(500, 500); //ウィンドウのサイズ //*** キャンバスの初期化 MyCanvas mc = new MyCanvas(); add(mc); //フレームにキャンバスを追加 setVisible(true); //ウィンドウの表示 //ゲームデータの初期化 mc.init(); //スレッドを作成 mc.initThread(); } }