As already mentioned this can't be answered without knowing what your applications are doing and how they are implemented.
They should avoid polling (checking states inside loops) and calling blocking functions. Use events instead which usually requires creating threads.
If applications perform long running calculations producing a high load you might change the priority of the threads performing these operations (see
Thread.Priority Property (System.Threading)[
^] ) and/or insert sleep periods (usually not using
Sleep()
but one of the
Wait()
methods with timeout parameter to allow handling events).