But, GCD spins up threads to 
handle remaining work items.
This means you can end up with a large number of threads 
and the system can become over committed.
With Swift, the structured concurrency model reduced the number 
of threads and context switches. 
Now, each core has only one thread.

Dart has a single-threaded execution model, 
with support for Isolates, an event loop, and asynchronous code. 
An Isolate is Dart’s implementation of a lightweight thread.
Unless you spawn an Isolate, your Dart code runs in the 
main UI thread driven by an event loop. 
Flutter’s event loop is 
equivalent to the iOS main loop—in other words, 
the Looper attached to the main thread.

Dart’s single-threaded model doesn’t mean 
you are required to run everything 
as a blocking operation that causes the UI to freeze. 
Instead, use the asynchronous 
features that the Dart language provides, 
such as async/await.