Of course, threads have legitimate uses too - but always try to see if you can design for separate processes instead, before commiting to a threaded single process model. Google Chrome shows the way.
I used to be a huge proponent of threading applications, but now, whenever possible, I choose multiprocess models instead. The extra protection from separate address spaces is very often worth it from a debugging perspective. And if you're serious about multiprocessing - you're likely gonna spend more time in the debugger than coding.