Adam Warski
1 min readAug 6, 2018

--

They are hidden behind various abstractions for good reasons: working directly with runnables, semaphores etc is very tricky, and very easy to introduce subtle bugs. Sometimes you need that power — and at least on the JVM, you can directly with runnables — but mostly you don’t. Of course, each abstraction is constraining in some way.

--

--

Adam Warski

Software engineer, Functional Programming and Scala enthusiast, SoftwareMill co-founder