A 回答 (2件)
- 最新から表示
- 回答順に表示
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()メソッドが終了しないためこのスレッドは止まりません。
この回答への補足
再度すいません。
では、最初からこうすればよかったですね。
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;
}
}
で良いということですね。
No.1
- 回答日時:
kicker のクラスがなんなのかわかりませんが、スレッドと言っていてstop()メソッドが非推奨ということからThreadクラスを派生したものでしょうか?
とりあえず上記の通りであると仮定して回答……しようとしたら公式のほうにstop()が非推奨な理由とその代わりにどう変更すべきかが書かれています。
http://docs.oracle.com/javase/jp/6/technotes/gui …
(表示が乱れる場合は表示エンコードを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クラスのインスタンスの参照を外すとそのスレッドの処理が終了することは決してありません。
この回答への補足
すいません。もう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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ここで言う「アロー演算子」の役割を教えてください。 1 2022/03/26 02:38
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- Java Java です 途中は省いてますが for(int i = 0; i < 25; i ++) { s 4 2022/05/20 23:36
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PostgreSQL ポストグレにあるExcelファイルを開くには 1 2022/12/13 18:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面系イベントの優先度を上げたい
-
Javaでのデバッグコード削除
-
tryの終了
-
doGetとdoPostの違い
-
java(swing)で、登録ボタンを押...
-
Javaアプリケーション実行の返...
-
onBlurとonFocusの処理順序につ...
-
PHPでDB処理中にプログレスバー...
-
C# PostMessage BeginInvok
-
重い処理を行っているとGIFアニ...
-
JAVAからJAVASCRIPT関数を呼び出し
-
「UIスレッド」「マルチスレッ...
-
C#で別スレッドの終了を知りたい
-
WPF C#でF10のイベント取得方法...
-
巡回バッファを使用した生産者-...
-
重たい処理のタイムアウト強制終了
-
MediaPlayerコントロールのイベ...
-
ラジオボタンの選択判定
-
Linux上でのTomcatのServletプ...
-
javaのプログラムが止まる
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
Tomcat高負荷時の設定について
-
onBlurとonFocusの処理順序につ...
-
Javaでのデバッグコード削除
-
ラジオボタンの選択判定
-
WPF C#でF10のイベント取得方法...
-
doGetとdoPostの違い
-
SwingUtilities.invokeLater(ne...
-
アコーディオンメニューをアン...
-
数値の定数を付ける時
-
switch文の中に、throws new Ex...
-
JAVAからJAVASCRIPT関数を呼び出し
-
再度、スレッドが実行中かどう...
-
ラベルの表示までが異常に遅い...
-
JavaScriptからJAVAクラスを呼...
-
javaのプログラムが止まる
-
Javaプログラムからポップアッ...
-
C#で別スレッドの終了を知りたい
-
vba Sleep関数について教えてく...
-
Tomcatのスレッドを破棄する方法
おすすめ情報