本の真似をして、スレッドを書いてみたんですがに何も起こりませんでした。全く分かりません。どうすれば良いでしょうか?
public class Frame1 extends Frame implements Runable{
.................
.................
Thread kick = new Thread(this);
int time;

public void start() {
if (kick ==null)
kick.start();
}


public void run() {
while (kick == Thread.currentThread()) {
time++;
String s = Integer.toString(time);
textArea1.append( s + "\r\n");
try{
Thread.sleep(1000);
}catch(InterruptedException e){}
}
}

このQ&Aに関連する最新のQ&A

A 回答 (4件)

以下のようなサイトを発見しました。


それらと質問のコードを見比べていて気が付いたのですが、
最初に「Thread kick = new Thread(this);」とオブジェクト放り込んでますよね?
だからstart()の中の「kick ==null」に引っかからないのでは?
参考サイトのコードを見ていただければ分かると思うのですが、

Thread kick= null;
とした上で、
public void start() {
if (kick ==null)
kick = new Thread(this);
kick.start();
}
としてみてはいかがでしょうか?

参考URL:http://pascal.seg.kobe-u.ac.jp/~shii/java/exampl …

この回答への補足

以下のように書き換えてみたんですが、さっぱり動きません・・・。おかしいですね・・・???。
Thread kick = null;
int time;

public void start() {
if (kick == null){
   kick = new Thread(this);
    kick.start();
}

}

public void run() {
while (true) {
      time++;
     System.out.println(time);
String s = Integer.toString(time);
textArea1.append( s + "\r\n");
try{
Thread.currentThread().sleep(1000);
}catch(InterruptedException e){}
}
}

補足日時:2000/12/26 17:42
    • good
    • 0
この回答へのお礼

動くようになりました。
どうも ありがとうございました。

お礼日時:2000/12/26 21:26

Javaよく知りませんが・・・


通常Threadの生成ってmainの中でやりませんか?

多分FrameってThreadの継承クラスなんでしょうね、この書き方がと。
このFrame1が生成されても、mainがないとstartしない
んじゃないかなと思うんですが、どうでしょう?
外していたらごめんなさい。

この回答への補足

ある本の例ではこのように書いてありましたのでmainは必要ないと思いました。

class ??? extends Frame implements Runnable{

public ??? (){
・・・・・・
thread.start();
}

public void run() {
スレッドに関する処理
  }

}

補足日時:2000/12/26 19:35
    • good
    • 0
この回答へのお礼

どうも ありがとうございました

お礼日時:2000/12/27 20:03

whileの中が実行されてないのでしょうか…。


whileの中の条件式については値を変えて試験しましたか?
もししていなければ、試しに条件式にtrueか1を入れてみてください。(run()にきたら必ず実行という状態)

私の方も手探り状態ですみません(;n;)

この回答への補足

whileの中をtrue,1 に変えてみましたがうまくいきませんでした。1にしたら実行もできませんでした。whileの中に入れたSystem.out.printlnも実行されないので、while文が実行されていないようです…。

補足日時:2000/12/26 16:02
    • good
    • 0

遅い回答ですみません。


もう解決されてしまったかもしれませんが、一応。

何も起こらないとはどういう状態ですか?
エラーは起きていますか?それすら起きませんか?

デバグ方法として、各ポイントにprint文(JavaだとSystem.out.println("文字列");ですか)を入れて、どこが実行されてて、どこがされてないのかを明確にするのをおすすめします。

ちなみに、質問文の中のコードは閉じカッコ(})がひとつ足りないと思うのですが、コピペミスか何かでしょうか?

この回答への補足

}は間違えて消してしまったようです。
エラーは起きてません。実行できました。
textareaに数字が出るはずなのですが、何も出ません。

補足日時:2000/12/26 13:39
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフレーム上のコンポーネントの削除について

フレーム上の表示内容を切り替えるために、
それまでフレーム上にあったチョイス(choice)を
remove(choice1)メソッドで削除して、その場所に(その上に)画像(image)を表示したいと思うのですが、
チョイスは消えて表示されなくなるのですが、
チョイスのあったところだけ画像が表示されません。
チョイスの影響を消して、普通に画像を表示するにはどうしたらよいでしょうか。よろしくお願いします。

choice1.setLayout(null);
choice1.setBounds(500,300,100,20);
のように、nullレイアウトにしてあります。

Aベストアンサー

>remove(choice1)メソッドで削除
>チョイスは消えて表示されなくなる
>チョイスのあったところだけ画像が表示されません


「『チョイス』以外にそこにまだ
不要なごみコンポーネントが追加されてるから
(つまり削除してない「何か」があるから)」。

どのコンポーネントになにをどれだけ追加(add)したのか、
自分のソースコードを
再点検しましょう。

Qスレッドの安全な終了のさせ方

スレッドの安全な終了のさせ方

 メインスレッドにてCreateThread命令を使い、あるサブスレッドを作りました。
このサブスレッドは内部でmallocを使い動的に配列領域を確保して
その配列領域をforループ等で「かなり時間の掛かる処理」として繰り返し
アクセスしています。
ループが終了した時に「free」を実行してmalloc領域を開放しています。

アプリ終了時にメインスレッドからこのサブスレッドを終了させるのに
メインウインドウにWM_DESTROYメッセージが送られた時、これまで単に
そこで「CloseHandle(hSubThread);」とだけ書いていたのですが、
もしかしたらこれでは場合によっては(サブスレッドがループ処理中だったら)
malloc領域が開放されずにリークしてしまうのではないかと思いました。

 そこでイベントオブジェクトを使い、サブスレッドがループ処理中の
時には非シグナル状態にして、ループが終了しfreeで領域を開放した後
シグナル状態にするということにして、メインスレッドはそれを
WaitForSingleObjectで待つという構造にしました。

ところが「メインスレッドに待ちを作るな」という言葉通り、これでは
上手く行きませんでした。サブスレッドはその時間の掛かる処理の
最中でSendMassage等でメインスレッドの処理を促すような命令を
(例えばその処理の進捗状況を表示するなど)を幾つも行っていたので、
もしWaitFor~でメインを待たせると「サブスレッドの処理も進まなくなり
結果両方がロックして動かなくなってしまう」という悲しい状況に
嵌ってしまうのです。

SendMessageを徹底的に無くすということも考えたのですが、
(例えばPostMessageに書き換えるなどもやってみたのですが、これは
全く意図した動作をしてくれない場合もあり)、別の方法では
どうしても代替できないケースもあって、全て消すというのは
現実的ではないのかもと。。

 このようなサブスレッドを安全に終了させるにはどうしたら良いでしょうか?
あるいは単にデストロイ時にCloseHandleとするだけでも良いのでしょうか?

スレッドの安全な終了のさせ方

 メインスレッドにてCreateThread命令を使い、あるサブスレッドを作りました。
このサブスレッドは内部でmallocを使い動的に配列領域を確保して
その配列領域をforループ等で「かなり時間の掛かる処理」として繰り返し
アクセスしています。
ループが終了した時に「free」を実行してmalloc領域を開放しています。

アプリ終了時にメインスレッドからこのサブスレッドを終了させるのに
メインウインドウにWM_DESTROYメッセージが送られた時、これまで単に
そこで「CloseHandle(hSu...続きを読む

Aベストアンサー

>SetEvent(hEventObject1);//イベントオブジェクトをシグナルに
スレッド終了を判断する場合はスレッドのハンドル自身を見た方が確実です。
HANDLE thread_handle = ::CreateThread(略);
(略)
::WaitForSingleObject( thread_handle , INFINITE );
スレッドは終了時にハンドルがシグナル状態になります。


>SendMessage(hMainWnd,....);
>//メインウインドウに何かのメッセージを送信
>//なってた時に処理が進まなくなる。
名前から察するにhMainWndはメインスレッドで動いているようですが
そのメインスレッドの処理がWaitForSingleObjectによって止まっているのなら処理は返ってきません。
つまりサブスレッドがメインスレッドとなんらかのやりとりをしたいなら、
この時点でメイン側はWaitForSingleObjectで待ってはいけません。

1. Main -> Subに終了前準備しろと通知
2. Sub -> Mainに終了前準備完了を通知
3. Main -> Subに終了しろと通知
4. MainはSubが終了するのをWaitForSingleObjectで待つ。

>SetEvent(hEventObject1);//イベントオブジェクトをシグナルに
スレッド終了を判断する場合はスレッドのハンドル自身を見た方が確実です。
HANDLE thread_handle = ::CreateThread(略);
(略)
::WaitForSingleObject( thread_handle , INFINITE );
スレッドは終了時にハンドルがシグナル状態になります。


>SendMessage(hMainWnd,....);
>//メインウインドウに何かのメッセージを送信
>//なってた時に処理が進まなくなる。
名前から察するにhMainWndはメインスレッドで動いているようですが
そのメインスレッドの...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング