Using non-blocking IO is just the old select loop in C. You just wait in a loop that goes and checks if you can read from anyone yet, if you can then do a little processing, else go back and check again.
This has key advantages over blocking and threading. The biggest is that starting a new thread is expensive. A second one is that you get more flexibility over your control logic. A third is that by having less going on in parallel, you have fewer internal races to deal with.
This has key disadvantages as well. The biggest is that if something occupies your thread for a bit, everything comes to a halt. Another is that there are now race conditions between your noting that there is external input and your taking advantage of it. A third is that you wind up doing a classic "busy wait", occupying significant system resources in just finding out that you have nothing to do.
In reality, of course, most computers only do one thing at a time, but simulate doing many things by switching between them rapidly. (SMP computers are, of course, exceptions. But even they typically seem to be doing more things at once than they have CPUs.) All that blocking versus non-blocking really means is whether you are handling the switching logic in your code, or whether that switching is being handled at a lower level (eg in the OS).
Which is better? My belief is that, "It depends." But I would say that if you have pervasive multi-threading, then blocking IO is safer since it handles more race conditions automatically. But when given a choice, I prefer single threading to having multi-threading.
Cheers,
Ben