私は(Javaでの)並列/並行プログラミングに頭を悩ませようとしていて、これまで読んでいたチュートリアルのいずれにも含まれていないように見えるいくつかの基本に夢中になっています。
「マルチスレッド」または「並列/並行プログラミング」について話すとき、それは私たちが大きな問題を抱えてそれを多くのスレッドに広げていることを意味しますか、それとも最初にそれをより小さなサブ問題に明示的に分解して渡しますか?独自のスレッドに対する各サブ問題?
たとえば、がEndWorldHungerTask implements Runnable
あり、タスクがいくつかの大きな問題を達成するとします。その目的を達成するために、それはいくつかの本当に重い持ち上げをしなければなりません、例えば、1億回:
public class EndWorldHungerTask implements Runnable {
public void run() {
for(int i = 0; i < 100000000; i++)
someReallyExpensiveOperation();
}
}
これを「並行」または「マルチスレッド」にするために、これEndWorldHungerTask
をたとえば100個のワーカースレッドに渡します(100個のワーカーのそれぞれがJVMによって、いつアクティブになり、次の反復/someReallyExpensiveOperation()
呼び出しで作業するかを指示されます)。 )、または100人のワーカーのそれぞれがループ/実行する作業のさまざまな部分を反復処理するように、手動/明示的にリファクタリングしますか?どちらの場合も、100人のワーカーのそれぞれが100万回しか反復していません。
しかし、最初のパラダイムでは、Javaは各スレッドにいつ実行するかを指示しています。2つ目では、開発者は事前に手動で(コード内で)問題を分割し、各サブ問題を新しいスレッドに割り当てる必要があります。
私は、Javaの土地で「通常行われている」方法を尋ねていると思います。そして、この問題のためだけでなく、一般的に。