0

次のオブジェクトを検討してください。

public class Mindblower implements Runnable {

    private Thread ownThread;        

    @Override
    public void run() {
        // do all the things
    }

    public Mindblower() {
        ownThread = new Thread(this);
        ownThread.start();
    }
}

これは機能しますか?スレッドがスレッドに渡される Runnable のメンバーであるという事実は問題になりますか? うまくいくように思えますが、それについて考えると、まるでクリストファー・ノーランの映画を見ているかのように頭が痛くなります.

ボーナス ポイントについて.start()は、Runnable のコンストラクター内で が呼び出されるかどうかは重要ですか?

4

4 に答える 4

1

はい、動作しますが、これを達成し、コードを理解しやすくするために、他のいくつかの方法を検討することをお勧めします。Runnableたとえば、メイン クラスから呼び出す2 番目のクラスを作成できます。

public class Mindblower {

  public static void main(String[] args) {
    Thread ownThread = new Thread(new MindblowingRunnable());
    ownThread.start();

    // Other stuff that you want done concurrently on the main thread
  }

  private class MindblowingRunnable implements Runnable {
    @Override
    public void run() {
      // Stuff to be carried out in your thread
    }
  }
}

クラスが public である必要がないRunnable限り、 がそのコンテキストでのみ使用される場合、これを少し簡単にすることができます。Runnable

public class Mindblower {

  public static void main(String[] args) {
    Thread ownThread = new MindblowingThread();
    ownThread.start();

    // Other stuff that you want done concurrently on the main thread
  }

  private class MindblowingThread extends Thread {
    @Override
    public void run() {
      // Stuff to be carried out in your thread
    }
  }
}

スレッドへのローカル参照を保持できますが、これはメイン スレッドから割り込みが必要な場合にのみ役立ちます。内からRunnable、 を呼び出すだけThread.currentThread()です。

おまけの質問についてstart()は、コンストラクターから、または から呼び出す必要はありませんmain()。これらはどちらも、プログラムの開始直後にスレッドを実行したい場合のオプションですが、場合によっては、最初にユーザー入力を待って、start()他のメソッドから呼び出したい場合があります。

これはすべて、単一のスレッドのみを作成していること、または複数のスレッドがある場合、それらの間の同期がプログラムにとって問題にならないことを前提としています。同期が重要な場合は、代わりにスレッド プールを検討してください。

于 2013-09-02T21:59:49.310 に答える
1

のアイデアは、実際のスレッド/実行コンポーネントから何をする必要がRunnableあるかを分離することです。両方を混在させると、使用しても何のメリットもありません( extends スロットを使用しない場合を除く)Runnable

あなたの場合、拡張Threadしてオーバーライドrun()すると同じ結果が得られます。

于 2013-09-02T20:39:12.053 に答える
0

実行中のスレッドは常に からアクセスできるため、これを行う意味はまったくありませんThread.currentThread()

また、自動起動したい場合は、このようなものを使用する必要がありますが、これはまだお勧めできません。クラスのユーザーは、スレッドを開始する前に他のことをしたい場合があります。

public class Mindblower implements Runnable {

  @Override
  public void run() {
    // You can access your thread at any time - you can even interrupt yourself.
    Thread.currentThread().interrupt();
  }

  public Mindblower() {
    // Do not start here.
  }

  {
    // A more acceptable way of having a self-starting thread but still not a good idea.
    new Thread(this).start();
  }
}
于 2013-09-02T21:19:36.030 に答える
0

できます。

しかし、それは非常に悪い習慣です

于 2013-09-02T20:37:25.163 に答える