2012-01-15 14 views
1

スレッドの概念を完全に理解していませんでした。スレッドが終了したときに実行コードを確認します。

ExecCommand.java

// I don't know how this work, for now 
package therads; 

// Here we will have the methods and run them from the Main.java 
public class ExecCommand implements Runnable 
{ 
    String name; 
    int time; 

    public ExecCommand(String s,int amount) 
    { 
     name = s; 
     time = amount; 
    } 

    // Run method (Runnable) 
    public void run() 
    { 
     try 
     { 
      // What to execute when the thread is started 
      System.out.printf("%s is sleeping for %d\n",name,time); 
      Thread.sleep(time); 
      System.out.printf("%s is done\n",name); 
     } 
     catch(Exception e) 
     { 

     } 
    } 

    // This dosen't work when the thread is stopped 
    public void stop() 
    { 
     try 
     { 
      System.out.printf("STOPPED!"); 
     } 
     catch(Exception e) 
     { 

     } 
    } 

    // This dosen't work when the thread is started 
    public void start() 
    { 
     try 
     { 
      System.out.printf("Started!"); 
     } 
     catch(Exception e) 
     { 

     } 

    } 
} 

と私から彼に電話:

Main.java

Thread t5 = new Thread(new ExecCommand("Good Function",1000)); 
t5.start(); 
  1. 私が欲しい私たちは、次のコードを持っていると仮定〜println()スレッドが開始されると「開始」、終了すると「停止」となります。可能です?

  2. スレッドが完了すると、スレッドは終了し、メモリから完全に解放されますか?もしそうでなければ、どうすればいいのですか?

  3. キーを押すまでに1000ミリ秒ごとに1回ずつ繰り返すスレッドを作るにはどうすればよいですか?私は考えていたwhile(true) { t5.start; }

私は確かに分かりません。

答えて

5

まず、startstopの方法の使用は何もありません。すべてはrunメソッドで行われます。

開始時と終了時にメッセージを印刷するには、runメソッドの開始時と終了時にメッセージを出力します。ループへの無期限と外側のイベントが発生するまでにフラグとループを使用して、コードを実行し続ける:あなたは、スレッドが停止する場合は

class ThreadTask implements Runnable { 
    private volatile boolean flag = false; 

    public void setFlag(boolean value) { 
     flag = value; 
    } 

    public void run() { 
     System.out.println("Started"); 
     while(!flag) { 
      // execute code 
     } 
     System.out.println("Stopped"); 
    } 
} 

すると、ちょうどsetFlagを使用してフラグをtrueに設定します。

はい、スレッドは、runメソッドが終了した後、ランタイム+ OSによって自動的にクリーンアップされます。

+0

whileループでtry {...} catch(InterruptedException e)(...}を追加することをお勧めしますが、これはそのjistです。 –

+0

ありがとう、私は試してみます:) – Master345

+0

作品完全に、私はまた、スレッドを繰り返す回数を追加しました – Master345

0

開始メソッドと停止メソッドをオーバーライドする必要はありません。コールバックメソッドではありません。

SwingWorkerクラスに似たものがあります(UI関連のスレッド同期に興味があると仮定します)。

もしそうでなければ、スレッドをサブクラス化してコールバックメカニズムを提供することができます。

+0

あなたはstart()とstop()の理由がないと言っていますか? – Master345

+0

startメソッドとstopメソッドが呼び出されるはずです。コールバックメソッドではありません。 –

3

.start()と.stop()が呼び出されるのはいつ、いつですか? Runnableにはインタフェース内に1つのメソッドしかありません。 .run()。 JavaDocs for Threadはそれをかなりうまくカバーしています。 http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html。あなたのスレッドが始まるときに何かが起きるようにしたいなら、その何かを.run()の先頭に置いてください。あなたのスレッドが終了したときに何か起こりたいのであれば、.run()の一番下に置いてください。スレッドで.start()と.stop()メソッドを使って大規模で行うことはお勧めできません。 .run()内のすべてのライフサイクルのことを行うことに集中してください。また、Goetzの "Java Concurrency in Practice"のコピーを入手してください。あなたのオプションの全範囲が表示されます(直接スレッドを所有していないなど)。

+0

答えをくれてありがとう、あなたは私の頭の中で大きな論理を作りましたが、その大きな本を読むのはちょっと残酷だとは思わない?その人からのチュートリアルをYouTubeで作成するのは本当に面白いです:D – Master345

+0

@RowMinds。 JCiPがカバーするものについては、それほど大きくない。誤ったスレッディングを取ると実際にあなたのプログラムが台無しになることがあります。JCiPは、動作の仕方を理解するために頭を適切な場所に置きます。あなたもそれをカバーするいくつかの動画を見つけた場合は、それを持っています。絵は千の言葉ですよね? –

+0

あなたはそれを言う最初の人ではありません、私は読んでいる必要があります、時にはそれはプログラミングについての非常に退屈な読書を取得します、私はむしろシェイクスピアを読んで...しかし、それはそれです、ありがとう:) – Master345

0
  1. もちろんです。あなたは自分のrun()方法の1行目に「開始」をプリントすることができ、印刷のいずれかrun()方法のfinallyセクションの「停止」または単にt5.join()
  2. 後にあなたは詳細を語らず、何もすることができません。しかし、リソースは必要に応じてすぐに解放されると見なすことができます。 (あなたがスレッド内で割り当てられたすべての参照のために到達可能なリンクを持っている場合はもちろん、JVMはこれらは役に立たないことを決めることができないので、「完全な」ここでは、適切な言葉ではありません。)
  3. java.util.Timer
を見てみましょう
0
  1. printfの代わりにSystem.out.printlnを使用する場合は、これらのコード行を変更してください。これらの呼び出しについてスレッド関連はありません。
  2. スレッドが実行を停止し、ライブ参照が存在しない場合、スレッドはガベージコレクタによって収集され、メモリから解放されます。すべてのオブジェクトと同じです。
  3. stop()を上書きしないでください。これはdeprecatedであり、アプリケーションコードではなく、JVMによって実際に処理されるはずです。 docs
  4. Thread.sleepを使用して一定期間スリープ状態にすることができます。スレッドを実行するには、runをオーバーライドするだけです。スリープの正確さは、プラットフォームと使用可能なシステムクロックの解像度によって異なります。