Most answers are ignoring the word "JAVA" in the title. Java has executors. If you want to use alot of threads, use a threadpool executor( or possibly a "stream" if you are using java 8).
Those are nice ways to obscure the fact that you are using threads. If you can subdivide whatever it you are doing into a bunch of short tasks, you can let the system manage how many threads you are using.
Since you are looking to "wait" for timers, may I suggest you use:
1. A timer thread: To push events into the executor. (don't actually run them, just schedule them to run later in the executor)
2. A threadpool executor: To execute the events.
Then you can play with the treadpool size. Notice that the timer thread is not bogged down, because it is not doing any real work.
All of these classes are supplied with Java. You don't have to write anything yourself