0

重複の可能性:
Java:「Runnableを実装する」と「スレッドを拡張する」

Threadを拡張する独自のカスタムオブジェクトを作成することと、Thread(Runnable)コンストラクターを使用してスレッドを作成することには、微妙な違いがあるのではないかと思います。

Threadを拡張するクラスを使用すると正常に機能するコードがいくつかありますが、Thread(Runnable)コンストラクターを使用してスレッドを作成するロジックを使用しようとすると、新しいスレッドが正しく機能していないようです-それらを検出できません私が作成したカスタムサブクラスを使用するときと同じように生きていて、それらは決して終わらないようです。

私のコードでは、いくつかのスレッドを生成し、スレッドのリストを検索して、生きているスレッドを見つけ、それが死ぬまでそれに参加しています。次に、リスト内で生きているスレッドをもう一度検索して参加します。これは、すべてのスレッドが終了するまで続きます。

読んでくれてありがとう。

4

3 に答える 3

2

スレッドは、作業を行うためのリソースです。Runnableは作品です。新しいタイプのリソースを作成していますか、それとも単に実行したい作業を定義していますか?

スレッドを「終了」するには、「ru​​n」メソッドから戻るだけです。コードがアクティブであるかどうかを判断できないことの意味を確認するには、コードの例を確認する必要があります。

もちろん、Runnablesを作成すると、コードをリファクタリングして、将来ThreadPoolを使用するのも簡単になります。

于 2012-04-26T20:45:32.433 に答える
2

私のコードでは、いくつかのスレッドを生成し、スレッドのリストを検索して、生きているスレッドを見つけ、それが死ぬまでそれに参加しています。

どのように(そしてなぜ)「私のスレッドのリストを検索」していますか?Thread代わりに、ある種のにを追加Collectionします。その後、繰り返し処理して、それぞれThreadに順番に参加できます。

  List<Thread> threads = new ArrayList<Thread();
  for (int i = 0; i < 100; i++) {
     Thread thread = new Thread(new Runnable() ...);
     thread.start();
     threads.add(thread);
  }
  ...
  for (Thread thread : threads) {
      thread.join();
  }

さらに良いのは、でExecutorService指定されたのいずれかを使用することExecutorsです。スレッドプールの作成とプールが完全に終了するのを待つことに関する多くの機能があります。ほとんどの場合、以上をお勧めしnew Thread(...)ます。

作成したカスタムサブクラスを使用した場合と同じように、それらが生きていることを検出できません。

の名前を設定しようとしている場合はThread、のコンストラクターでこれを行うことはできませんRunnable。ただし、メソッドでこれを行うことができます。run()できるよ:

  new Thread(new Runnable() {
      public void run() {
          Thread.currentThread().setName("...");
      }
  });

Threadそうでなければ、それがすでに終わっていない限り、なぜあなたがあなたを見ないのかわかりません。

彼らは決して終わらないようです。

を使用すると、メソッドがaまたは。のいずれかを介して戻っRunnableたときにスレッドが終了します。これは拡張とほとんど同じなので、なぜこれが機能しないのかわかりません。run()returnthrowThread

于 2012-04-26T20:49:00.397 に答える
1

複雑でエラーが発生しやすいスレッドを自分で管理しようとせずに、同時実行ユーティリティを使用することを強くお勧めします。コンカレント API を使用すると、適切なパターンをすぐに適用するのにも役立ちます。

于 2012-04-26T20:50:57.823 に答える