The javadoc says it best:
When a new
task is submitted [...], and
fewer than corePoolSize
threads are
running, a new thread is created to
handle the request, even if other
worker threads are idle. If there are
more than corePoolSize
but less than
maximumPoolSize
threads running, a
new thread will be created only if the
queue is full. By setting
corePoolSize
and maximumPoolSize
the same, you create a fixed-size
thread pool. By setting
maximumPoolSize
to an essentially
unbounded value such as
Integer.MAX_VALUE
, you allow the
pool to accommodate an arbitrary
number of concurrent tasks.
As for your specific situation, sending 500 emails all at the same time is pointless, you'll just overwhelm the mail server. If you need to send a large number of emails, then use a single thread, and send them down the pipe one at a time. The mail server will handle this much more gracefully than 500 separate connections.