https://krishnakishorev.medium.com/java-multithreading-concurrency-and-parallelism-part-2-f323a2e36454