スレッドに関する問題に直面しています。runnableを実装するクラスがあり、そのクラスでthread.start()メソッドを使用できます。私の質問はjava.util.concurrent.ExecutorService
、executor.submit(thread)を呼び出すことができるクラスがもう1つあるということです。
thread.start()
との違いは何executor.submit(thread)
ですか...
スレッドに関する問題に直面しています。runnableを実装するクラスがあり、そのクラスでthread.start()メソッドを使用できます。私の質問はjava.util.concurrent.ExecutorService
、executor.submit(thread)を呼び出すことができるクラスがもう1つあるということです。
thread.start()
との違いは何executor.submit(thread)
ですか...
executor.submitメソッドは、スレッドではなくランナブルを取ります。executorServicesのポイントは、スレッドの作成とプールを制御するため、スレッドを呼び出すコードで制御する必要がないことです。
エグゼキュータにスレッドを送信しないでください。まず、呼び出されるメソッドはであるため、これは単に無駄です。必要なのはrun()
、だけで、そのためのメソッドは必要Runnable
ありませんThread
。
Thread
次に、この問題は最新のJDKで解決されていますが、以前は、多数のオブジェクトを作成してそれらを呼び出さないと、メモリリークの問題が発生する場合があり.start()
ました。基本的に、オブジェクトを作成すると、呼び出されたThread
後にのみ再利用できるメモリが割り当てられます。.start()
したがって、これを行うことexecutor.submit(thread)
は、以前のJDKでは潜在的に危険です(JDK6程度でのみ解決されたと思います)。
質問に戻ると、executor.submit(thread)は無効です。エグゼキュータは独自のスレッドを使用してランナブルを実行するため、これは単に間違っています。結局のところ、エグゼキュータを使用することのすべてのポイントです。タスク(呼び出し)と実行を分離したい。エグゼキュータ(スレッド)を提供する場合にのみ、を使用Thread
する必要がありますが、そうする必要があることはめったにありません。Runnable
一般に、自分で対処するのではなく、を実装し、エグゼキュータを使用して実行することをお勧めしThread
ます。