With more demanding customer needs and the greater availability of multi-core systems, server applications have become increasingly multi-threaded over the years. For example, in our LabWizard server there are threads for:
Receiving cases from the lab system.
Sending reports to the lab system.
Periodic tasks such as committing the databases and doing a nightly backup.
Communicating with users via RMI.
Additionally, some of the client commands create their own threads on the server in which data mining tasks are performed.
Although we've never had quite as much time as we'd like to carefully think through the concurrent programming involved, the software has very few concurrency problems and no serious ones ...