There are two classes of problems where the application of threads is a good idea.
Note: Threads are like overloading operators in C++ — it may seem like a good
idea (at the time) to overload every single operator with some interesting use, but it
makes the code hard to understand. Similarly with threads, you can create piles of threads,
but the additional complexity makes your code hard to understand, and therefore hard to
maintain. Judicious use of threads, on the other hand, results in code that is functionally
very clean.
Threads are great where you can parallelize operations — a number of mathematical problems spring
to mind (graphics, digital signal processing, and so on). Threads are also great where you
want a program to perform several independent functions while sharing data, such as a web-server that's serving
multiple clients simultaneously.