A menudo leo que el paralelismo y la concurrencia son cosas diferentes. Muy a menudo, los respondedores / comentaristas llegan a escribir que son dos cosas completamente diferentes. Sin embargo, en mi opinión, están relacionados, pero me gustaría una aclaración al respecto.
Por ejemplo, si estoy en una CPU multinúcleo y logro dividir el cómputo en x cómputo más pequeño (digamos usando fork / join) cada uno ejecutándose en su propio hilo, tendré un programa que está haciendo cómputo paralelo (porque supuestamente, en cualquier momento, varios hilos se ejecutarán en varios núcleos) y serán concurrentes, ¿verdad?
Mientras que si simplemente estoy usando, digamos, Java y lidiando con eventos de UI y repintado en el hilo de despacho de eventos más ejecutando el único hilo que creé yo mismo, tendré un programa que sea concurrente (hilo EDT + GC + mi hilo principal etc.) pero no en paralelo.
Me gustaría saber si estoy haciendo esto bien y si el paralelismo (en un sistema "único pero con múltiples núcleos") siempre implica concurrencia o no.
Además, ¿se ejecutan programas de subprocesos múltiples en CPU de múltiples núcleos pero donde los diferentes subprocesos están haciendo un cálculo totalmente diferente se considera que usan "paralelismo"?