
No.3ベストアンサー
- 回答日時:
#1です。
#2さんのお礼で誤解があるようですので補足しておきます。
下のスレッドは、0xffで埋められた約5MBのファイルを作るものです。
「キャンセルされた場合ファイルを消す」という仕様です。
(例外処理は省略しました)
5000000回のループが終わるとスレッドが終了しますが、
外部からdoCancel()メソッドを呼び出されても終了します。
スレッドのループ内で、キャンセルされているかチェックし、
キャンセルされていれば後始末(ファイルの削除)をして終了します。
なお、doCancel()、isCanceled()がsynchronizedなのは、
変数canceledに排他をかけるため。
変数canceledにvolatileが付いているのは、コンパイラの最適化による誤動作を
防ぐためです。
それと、stop()は非推奨のため、やはり使わないほうがいいでしょう。
class MyThread
implements Runnable
{
volatile boolean canceled = false;
/**スレッドの実行を終了させる
*/
synchronized public void doCancel(){
canceled = true;
}
/**スレッドがキャンセルされたか調査する
*/
synchronized public boolean isCanceled(){
return canceled;
}
public void run(){
File file = new File("........");
FileOutputStream fos = new FileOutputStream(file);
for(int i = 0 ; i < 5000000 ; i++){
if(isCanceled()){
fos.close();
file.delete();
return;
}
fos.write(0xff);
}
fos.close();
}
}
ngsvxさん、またまたありがとうございました。
少し想定していた内容と異なっていましたが、
なんとなく流れはつかめました。
早速試してみようと思います。
ありがとうございました^^

No.2
- 回答日時:
要するに、別スレッドで実行するrunメソッドを終了すれば、そのスレッドは終わります。
状況に応じてrunを(中断ではなく)終了すればいいのです。通常、常にスレッドで処理をし続けるというような場合は、runの中で無限ループのように処理を繰り返し続けるようになっていますね。そこで、必要に応じて繰り返しを抜けるようにすればいいわけです。
boolean runflag = true;
public void run(){
while(runflag){
・・・実行する処理・・・
}
}
例えばこんな具合にしておき、スレッドを終了したいときは、runflag = false;にすれば、whileを抜けてrunを終了します。終了すればスレッドはおしまいです。
Kyon2_PaPaさん、回答ありがとうございます。
頂いた方法は検討してはいたんですが、
要はいくつものスレッドが増えていくと処理的に重くなって
しまうのではないかと思い、完全に停止したほうが良いと
思っていました。
もし、この方法で問題なければ、試してみようと思います。
No.1
- 回答日時:
外部から停止させられる可能性のあるスレッドは、
停止用のメソッドを用意して、自分で停止処理をします。
機械的に勝手に停止させられると、データに不整合が起こる場合があるからです。
どのような不整合が起こるのかは、プログラム個別に違いますから、機械的に停止するstopメソッドは非推奨になっています。
ngsvxさん、ありがとうございます。
つまり、stop()を使わずにプログラムの流れ的に
実行しないようにするということでしょうか。
自分で不整合の可能性が把握できていれば、stopは使っても
大丈夫なのでしょうか。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaScriptからJAVAクラスを呼...
-
tryの終了
-
表示待ち時間に「処理中...」の...
-
vba Sleep関数について教えてく...
-
「タイプ初期化子が例外をスロ...
-
eclipse-Tomcatでのデバッグに...
-
関数内の変数に<summary>コメン...
-
エクセルVBAで、条件に一致する...
-
中学のクラス数
-
javascriptからjavaを呼び出したい
-
【sendkeysメソッドが動かずに...
-
Excelで =EMBED("Acrobat Docu...
-
引数で日付を2つ与え、その間の...
-
サーブレットコンテキストの意...
-
UMLのクラス図はmain()も含むん...
-
リフレクション
-
0歳児の指しゃぶりに関して
-
final修飾子を使っているのに、...
-
変数名の付け方
-
ウィンドウを最前面にできません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaプログラムからポップアッ...
-
Javaでのデバッグコード削除
-
tryの終了
-
Tomcat高負荷時の設定について
-
SwingUtilities.invokeLater(ne...
-
ラベルの表示までが異常に遅い...
-
vba Sleep関数について教えてく...
-
Delphiのマルチスレッドの割り...
-
ラジオボタンの選択判定
-
アコーディオンメニューをアン...
-
JSP、サーブレットの初期処理
-
ftp 同時複数接続の負荷テスト...
-
[Java] while(true)の意味
-
C#で別スレッドの終了を知りたい
-
switch文の中に、throws new Ex...
-
アロー関数がよくわかりません
-
セル範囲で文字を検索はFor必須?
-
PHP
-
Servlet+JSPを使ったWEBアプリ...
-
Javaプログラムから外部コマン...
おすすめ情報