- ベストアンサー
スレッド
kacchannの回答
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/misc/threadPrimitiveDeprecation.html このページの 「Thread.stop が推奨されないのはなぜですか」 をまず読もう。 次に、同ページの 「Thread.stop の代わりに何を使うべきですか」 を読むと、「推奨されないrun()メソッドの書き方(※でもわかりやすい)」と「推奨される書き方(※パッと見、わかりにくい)」の2つが書いてある。 で、この「推奨される書き方」、なんでこんなヘンチクリンなコードなのかというと、 その答えはココに書いてある。 http://sunsite.tus.ac.jp/java/javaj/jtutorial/applet/overview/threadExample.html (「繰り返しタスクの実行にスレッドを使用する」の項) ちなみに、azicyanさんに教えた人の説明とは、ちと異なってます(^^; ------------- あと、その人の 「2つの処理を同時に処理するためと覚えてください」 という言葉の意味は、 「スレッドを使いたい場合は、(よくわからないかもしれないが、)とりあえずこう記述しといてくれ」 という意味だと思います。当面はそれでいいんじゃないかな、とぼくも思います。 (sunのチュートリアルにも「詳しいことはともかく、とりあえず覚えとけ」みたいなこと書いてある http://java.sun.com/docs/books/tutorial/essential/threads/lifecycle.html)
関連するQ&A
- javaのwaitしてるスレッドをnotifyで起こすことが出来ない
JDK1.5 WindowsXPです。 現在マルチスレッドを試しています。 A、B、C三つのスレッドがあります。 AはBというスレッドを作るメインスレッドです。 Bは、waitするスレッドです。 public final void run(){ while (true){ try { //notifyが来るまで待機 waitForNotify(); //実際の処理 act(); //スレッド停止させるための割り込み例外 } catch (InterruptedException e) { Thread.currentThread().interrupt(); e.printStackTrace(); } //割り込み受信の場合強制終了する if (Thread.currentThread().isInterrupted()) { break; } } } こんな感じです。 そしてCのスレッドがnotify()を実行します。 しかしnotify()を実行してもスレッドは起きません。 Bに、 public synchronized void notifyM() throws InterruptedException{ wait(); } のようなメソッドを追加して、スレッドのインスタンスメソッドとして実行しても起きません。 notify()がJavaDOCなどを読んでも意味不明なため、 どのような使い方なら動くのか見当がつきませんので質問しました。 notify(スレッドB)みたいなら分かりいいんですが。
- ベストアンサー
- Java
- スレッド動かず
本の真似をして、スレッドを書いてみたんですがに何も起こりませんでした。全く分かりません。どうすれば良いでしょうか? 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){} } }
- ベストアンサー
- Java
- スレッドが実行中かどうかの確認
画面の中にボタンを作成し、そのボタンを押すとスレッドが実行される機能を作成しました。 「一度ボタンを押してスレッドが実行中の場合は処理を実行しない」 という処理を実装したいです。 上記の処理を以下のソースで考えていますが(1)の部分がわかりません。 そもそも(1)のようなことが可能かもわかっていない状況です。 (1)のようなことは可能なのでしょうか? どなたか、知恵を貸していただければと思います。 よろしくお願い致します。 /* ソース */ public class ExThread1 extends Thread{ public void run() { // 処理 } } public class TEST { public static void main(String[] args){ ExThread1 thread1 = new ExThread1(); // (1)スレッドが実行中ならstartしない if(スレッドが実行中ではない){ thread1.start(); } } }
- ベストアンサー
- Java
- 初心者です。
javaのソースについて質問です。 次のソースに関していくつか質問させて下さい。 public class HelloThread implements Runnable { //処理1 Thread th; int pause; public static void main(String args[]) { HelloThread hello; //処理2 hello = new HelloThread(); hello.start(); //処理3 try{ Thread.sleep(1000); } catch (Exception ex) { } //処理4 hello.stop(); } public HelloThread() { } public void start() { //処理5 th = new Thread(this); th.start(); } public void run() { //処理6 while(th != null) { System.out.println("Hello World!"); try { Thread.sleep(200); } catch (Exception ex) { } } } public void stop() { //処理7 th = null; } } 質問 (1)mainメソッドのhello = new HelloThread();で HelloThreadクラスの処理1の2行が実行されると 思いますが、その後にhello.start();が実行される のでしょうか? (2)hello.start();で処理5が実行されるのでしょうか? (3)th.start();でrun()が呼び出されるのでしょうか? (4)処理6を実行している間、処理3、4が実行される のでしょうか? 出来ればその理由も教えて下さい。 (5)このソースの処理4の後のpublic HelloThread()は 何か意味があるのでしょうか? 以上、初心的な質問だと思いますが、よろしくお願いします。
- ベストアンサー
- Java
- マルチスレッド:スレッドの終了を検知する(Ruby)
2つ以上のスレッドを生成・動作させ、それらが終了した時点で、メインに処理を移すといったことをRubyでしたいと思っています。 (スレッドが1つならば、メインをstopさせておき、スレッドの終了時に例外処理などを使ってrunさせる方法は思いつくのですが。。) 一つ考えたのは・・・ カウンタ変数をつくり、一つのスレッドが終了したらその値を増やす。 メインではwhileループによってその値を常に数えて、全スレッドの終了を把握する。 ただ無駄にwhileループを回してしまいます。。 一般的な効率の良い手段等あるのでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- C#のスレッド動作について
下記はスレッドの中で永久ループさせるテストプログラムで、1秒毎にテキストボックス内の数値をインクリメントします。 【問題点1】 ※1と※2のコマンドを削除した状態(※3のみ)で正常な動作を期待していたのですが、実際にはフリーズ状態となり、カウント値が表示されません。 ※2のApplication.DoEvent()を実装するか、※3の替わりに※1に実装すると正常動作となります。 ExecThread実行中は他の処理を出来なくても、これを抜けた時点で表示処理に移るので表示される筈と思っていたのですが違う様です。 【問題点2】 Invokeの替わりにBeginInvokeを使えばExecThread実行中でも他の処理と並列処理されると思っていたのですが、スレッドを2個用意して試したところInvokeと全く変わらず、やはりフリーズ状態となります。 【問題点3】 ExecThreadを匿名メソッドにすると「フィールド初期化子は、静的でないフィールド、メソッド、又はプロパティ'iCount'を参照できません」のエラーとなり、「iCount」をstatic変数にするとOKになります。 匿名メソッドではインスタンス変数は使えないのでしょうか。 上記3項目についてネットで調べたのですがその様な記述は見当たりませんでした。 何か使い方が間違っているのでしょうか? 間違い点など、ご指摘頂ければ有難いです。 どうぞ宜しくお願いします。 private void ExecWorker() ← スレッド { while (true) { Invoke(new Exec1Delegate(this.ExecThread)); ← BeginInvokeを使っても症状は同じ iCount++; Thread.Sleep(1000); ← ※1 このSleepが無いとフリーズする Application.DoEvent(); ← ※2 これがあると※1のSleepが無くてもOK } } delegate void ExecDelegate(); private void ExecThread() { lbThread.Text = iCount.ToString(); ← 匿名メソッドにするとエラーになる Thread.Sleep(1000); ← ※3 (※1のSleepと同時実装はしない) }
- ベストアンサー
- C・C++・C#
- スレッドについて
スレッドについて勉強中なのですが、簡単なスレッド作り、 スレッドの処理が終わってからメインの処理を行わせたくて 以下のようなプログラムを書いてみました。 そこで、WaitForSingleObjectを使ってスレッドが終了するのを 待ちたいのですが、WaitForSingleObjectではまってしまうようで sprintfのメッセージ(スレッドが止まってしまっている)が 表示されません。 WRITE関数の処理が終われば、、WaitForSingleObjectで処理が 戻ってくると考えているのですが…。 スレッドについてと、間違いについて教えてもらえないでしょうか? 宜しくお願いします。 main { if(!stop) { File = CreateFile(...); g_hThead = CreateThread(NULL,0,WRITE,(LPVOID)NULL,0,NULL); g_stop = false; }else { g_stop = true; ::WaitForSingleObject(g_hThead, INFINITE); CloseHandle(File); CloseHandle(hThead ); } } void WRITE() { while(!g_stop) { WriteFile(...); } ...処理を行う sprintf("スレッドを終了します。") }
- ベストアンサー
- C・C++・C#
- Javaのメソッドについて
Javaの参考書を見ていて分からない点があります。 Kadaiクラスで使用したcurrentThreadメソッドは、 Thread.currentThread()と書いてもthis.currentThread()と書いても 実行結果が同じになります。 currentThreadメソッドは静的メソッドなのに、 なぜthis.currentThread()でも良いのか分かりません。 this.currentThread()も静的メソッドなのでしょうか? class SampleThread{ public static void main(String[] args){ Thread t1=new Kadai(); t1.setName("Minimum"); //スレッド名を設定 t1.setPriority(Thread.MIN_PRIORITY); //優先順位を設定 Kadai t2=new Kadai(); t2.setName("Normal"); t2.setPriority(Thread.NORM_PRIORITY); Kadai t3=new Kadai(); t3.setName("Maximum"); t3.setPriority(Thread.MAX_PRIORITY); t1.start(); //プライオリティが最低のスレッドを実行 t2.start(); //プライオリティが普通のスレッドを実行 t3.start(); //プライオリティが最優先のスレッドを実行 } } class Kadai extends Thread{ public void run(){ Thread t=this.currentThread(); //スレッド情報を取得 System.out.println("スレッド名:"+t.getName()+" プライオリティ:"+t.getPriority()); } }
- ベストアンサー
- Java
- スレッド1とスレッド2を交互に実行するには?
スレッド1→スレッド2→スレッド1・・・と同期を取り合いながら交互にスレッドを動かしたいのですが、Thread.getState()を用いないで実現するよい方法はないでしょうか? どうしてもデッドロックが発生しうる方法しか思いつかず困っています。 例えば以下のプログラムで1212と交互に表示させたい場合です。 以下のプログラムは当然デッドロックになりますが、やりたいことを伝えるために載せておきます。 Object obj; //スレッド間通信用のobject class Test1 extends Thread { public void run() { while(true) { System.out.print("1"); synchronized (obj) { obj.notify();//相手をnotifyして obj.wait();//自分はwait } } } } class Test2 extends Thread { public void run() { while(true) { System.out.print("2"); synchronized (obj) { obj.notify(); obj.wait(); } } } } new Test1().start(); new Test2().start();
- ベストアンサー
- Java
補足
ありがとうございますーー いろいろ本を探した結果、やっと見つかりました。 ずばり同じところにたどり着きましたよ(*^_^*) >ちなみに、azicyanさんに教えた人の説明とは、ちと異なってます(^^; ですね~。ちょっとへんでしたね。 >という意味だと思います あはは。そうですね~。 でも、ほとんど決まりごとなのであながち悪い意見だとは思いませんが。 ありがとうございましたーーー