0

次のコードで実行可能なクラスを実装するクラスがある場合:

public class MyRunnable implements Runnable {
    public Thread t;
    // Other variables;

    public MyRunnable() {
        t = new Thread(this, "MyRunnable Thread");
        // Initialise other variables.
    }

    public void run() {
       //Do something.
    }
}

そして、私は次の方法で上記のクラスのインスタンスを作成しています:

public class MyFunc () {
  satic void main (String ards[]) {
     MyRunnable mr = new MyRunnable();
     mr.t.start();


     while (true) {
         Thread.sleep(10000);
         if (!mr.isAlive()) {
              //Execute mr again.
              // How to do it ?
         }
     }
  }
}

どうすればいいですか?

私は2つの方法を念頭に置いていますが、どちらが正しいかわかりません。

1.mr.t.start ();

2. MyRunnable mr = new MyRunnable(); mr.t.start();

mr の新しいインスタンスを作成する必要がありますか?

または、既存のインスタンスまたは mr を使用する必要がありますか?

4

4 に答える 4

3

Threadからへの参照を削除しMyRunnableます。

Javaでスレッドイディオムを開始すると、次のようになります

new Thread(new MyRunnable()).start()

ランナブルのクリーニングには、ガベージ コレクションの通常のルールが適用されます。runnable を参照するオブジェクトがない場合は、ガベージ コレクトされる可能性があります。

于 2013-06-07T10:00:00.793 に答える
1

Java でのマルチスレッド コードの記述にはいくつかのイディオムがあります。Java チュートリアルを参照してください。シンプルに分けてください:

public class YourTask implements Runnable {
   @Override
   public void run() {
      // do something
   }
}

最小限のサンプル アプリケーション:

public class YourApp {

public static void main(final String[] args) throws InterruptedException {

    final YourTask yourTask = new YourTask();
    final Thread thread = new Thread(yourTask);
    thread.start();

    thread.join();
   }
}

並行性には注意してください。たとえばJava Concurrency in Practiceを読んで適切に理解するまで、このコードを本番環境で使用しないでください。

于 2013-06-07T10:03:15.353 に答える
0

Runnable has the method run(), so you do not need separate Thread inside that.And nothing gets destroyed unless if you go out from the context of your variable (object) definition and you loose the reference.

http://www.javamex.com/tutorials/threads/thread_runnable_construction.shtml

于 2013-06-07T09:59:56.750 に答える