4

私は混乱しています(Javaは初めてです):

Runnableインターフェースを実装する場合、スレッド実行機能を取得するには、run()メソッドをオーバーライドする必要があります。このインターフェースを実装すると、オブジェクトは実行可能(?)型になります。Runnableインターフェースを実装するだけで、スレッド機能はどのように「注入」されますか?基本的に、Runnableを実装するクラスをインスタンス化するとき、スレッド機能で何が起こっているのでしょうか。私はおそらくここでいくつかの基本的なOOの概念を誤解しています。ありがとう。

thread.start()を実行するときにランナブルを探すことを「知っている」のはJVMですか?

4

7 に答える 7

9

の実装を作成する場合Runnable、クラスをJVMのスレッド容量に結び付けるものはありません。インターフェイスのインスタンスRunnableは、他のインターフェイスのインスタンスのようなものであり、単なる別のインスタンスです。

JVMのスレッドシステムを使用する場合は、Threadクラスの新しいインスタンスを使用する必要があります。これrun()により、実装のメソッドがRunnable別のスレッドで実行されます。

新しいスレッドの作成に関するすべてのロジックは、Threadクラスによって実行されます。

于 2010-09-24T19:35:48.790 に答える
4

Runnableは、別のスレッドで「実行できる」かどうかに関係なく実行できる作業を表します(Runnable.run()を自分で呼び出すこともできます)。

ただし、別のスレッドでRunnableを呼び出すには、次のようにします。

Thread thread = new Thread(new MyRunnable());
thread.start(); // MyRunnable will now be invoked in a new thread
于 2010-09-24T19:35:27.710 に答える
2

バックグラウンドで特別なことは何も起こっていません。

インターフェイスを実装Runnableすることで、クラスにpublic void run()メソッドが確実に含まれるようになります。

カスタムクラスをに渡すと、魔法が実際に発生しますThread

Thread th = new Thread(new YourCustomRunnable());
th.start();

上記のコードでは、新しいThreadものが作成され、メソッド内のコードrun()は別のスレッドで実行されます。

内部的には、スレッドはカスタムrun()メソッドを呼び出し、そのコードを別のスレッドで実行します。技術的には、次のことを行うことができます。

Runnable r = new MyCustomRunnable();
r.run();

上記のコードでrは、は別のスレッドでは実行されません。

于 2010-09-24T19:35:40.927 に答える
2

Runnableを実装しても、新しいスレッドは開始されません。新しいスレッドを開始するには、新しいThreadオブジェクトを作成して開始する必要があります。また、Threadの最もよく使用されるコンストラクターの1つは、Runnableをパラメーター(Thread(Runnable))として受け取ります。

Thread t = new Thread(new MyRunnable());
t.start();
于 2010-09-24T19:37:36.417 に答える
2

Runnableを実装しても、クラスがスレッド上で魔法のように実行されるわけではありません。代わりに、次のようなことを行うことができます。

Runnable myRunnable = new MyRunnable(); // MyRunnable implements Runnable
Thread t = new Thread(myRunnable);
t.start();

これで、myRunnableのrun()メソッド内のコードが別のスレッドで実行されます。java.util.concurrentパッケージのExecutorServiceとExecutorsを確認することをお勧めします。これらは、スレッドで(実行可能)に渡したものを実行するオブジェクトです。Executor / ExecutorServiceを使用する利点は、割り当てるスレッドの数を事前に定義し、さまざまな戦略を使用して拡大/縮小または一定に保つことができることです。

初心者にとってもう1つの興味深い点は、スレッドはデーモン(バックグラウンド)スレッドまたは非デーモン(UIなど)スレッドです。デーモン以外のスレッドが実行されている場合、JVMは停止しません。スレッドをデーモンとして宣言するには、setDaemon()を呼び出すだけです。エグゼキュータを使用する場合は、スレッドを作成してデーモンとしてマークするThreadFactoryを提供する必要があります。

お役に立てれば。

于 2010-09-24T19:38:50.260 に答える
1

インターフェースは一種の契約です。Runnableを実装することにより、インターフェースで定義されたすべてのメソッドを提供することを約束します。したがって、Runnable.run()を認識している「Thread」のような他のクラスは、クラスのオブジェクトでこのメソッドを呼び出すことができます。あなたのクラスについて何も知らなくても。

コードで新しいスレッドを開始するには、次のように記述する必要があります。

 Thread thread = new Thread(new MyRunnable());
 thread.start();

start()メソッドは、スレッドを生成するためにオペレーティングシステムの魔法を実行し、コンストラクターにパラメーターとして指定したオブジェクトで、そのオペレーティングシステムスレッドのコンテキストでrun()メソッドを呼び出します。

于 2010-09-24T19:37:06.760 に答える
1

最近の定義(春/ DI)の観点からは「注入」はありません。Runnableは、他のインターフェイスと何ら変わりはありません。これは、クラスがインターフェースで呼び出される必要なメソッドを提供することを示す「コントラクト」です。

于 2010-09-24T19:37:54.683 に答える