2

スレッドに関する問題に直面しています。runnableを実装するクラスがあり、そのクラスでthread.start()メソッドを使用できます。私の質問はjava.util.concurrent.ExecutorService、executor.submit(thread)を呼び出すことができるクラスがもう1つあるということです。

thread.start()との違いは何executor.submit(thread)ですか...

4

2 に答える 2

4

executor.submitメソッドは、スレッドではなくランナブルを取ります。executorServicesのポイントは、スレッドの作成とプールを制御するため、スレッドを呼び出すコードで制御する必要がないことです。

于 2010-06-07T13:23:38.853 に答える
1

エグゼキュータにスレッドを送信しないでください。まず、呼び出されるメソッドはであるため、これは単に無駄です。必要なのはrun()、だけで、そのためのメソッドは必要RunnableありませんThread

Thread次に、この問題は最新のJDKで解決されていますが、以前は、多数のオブジェクトを作成してそれらを呼び出さないと、メモリリークの問題が発生する場合があり.start()ました。基本的に、オブジェクトを作成すると、呼び出されたThread後にのみ再利用できるメモリが割り当てられます。.start()したがって、これを行うことexecutor.submit(thread)は、以前のJDKでは潜在的に危険です(JDK6程度でのみ解決されたと思います)。

質問に戻ると、executor.submit(thread)は無効です。エグゼキュータは独自のスレッドを使用してランナブルを実行するため、これは単に間違っています。結局のところ、エグゼキュータを使用することのすべてのポイントです。タスク(呼び出し)と実行を分離したい。エグゼキュータ(スレッド)を提供する場合にのみ、を使用Threadする必要がありますが、そうする必要があることはめったにありません。Runnable一般に、自分で対処するのではなく、を実装し、エグゼキュータを使用して実行することをお勧めしThreadます。

于 2010-06-07T13:28:39.760 に答える