线程“main”中的异常java.lang.IllegalArgumentException
在java.util.concurrent.ThreadPoolExecutor。(未知来源)
在java.util.concurrent.ThreadPoolExecutor。(未知来源)
在java.util.concurrent.Executors.newFixedThreadPool(未知来源)
在alerts.email.VinrEmailNotification.main(VinrEmailNotification.java:50)
这是我的例外。我该如何解决?这是我的代码:
package alerts.email;
import java.io.FileInputStream;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import alerts.utils.Constants;
/** The main entry point for the application which
* creates a pool of threads for probing the
* MessagesInTable, messages_sent_table and the
* retrytable and uses the Java 5 Executor service
* to run all the threads in the pool as parallel
* tasks
*
* @author Sunil Tuppale
* @date July-19-2010
* @version 1.0
*/
public class VinrEmailNotification {
static final Logger logger = Logger.getLogger(VinrEmailNotification.class);
public static void main(String[] args) {
Properties logProperties = null;
try { //settings for logging
String fileName = System.getenv("LOG_PROPERTIES_FILE");
if (fileName == null)
fileName="vinralerts.properties";
logProperties = new Properties(System.getProperties());
logProperties.load(new FileInputStream(fileName));
PropertyConfigurator.configure(logProperties);
logger.debug("Logging initialized in VinrEmailNotification class ");
} catch(Exception e) {
e.printStackTrace();
}
/*
* create a thread pool with four threads
*/
int THREAD_POOL_SIZE = ConnectionPoolProvider.getInstance().getThreadPoolSize();
ExecutorService messagesInTableTPExecSvc = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
//ExecutorService messagesSentTableTPExecSvc = Executors.newFixedThreadPool(Constants.THREAD_POOL_SIZE);
//ExecutorService retryTableTPExecSvc = Executors.newFixedThreadPool(Constants.THREAD_POOL_SIZE);
/*
* place four tasks in the work queue for the thread pool */
for( int i = 0; i < THREAD_POOL_SIZE; i++ ) {
messagesInTableTPExecSvc.execute(new MessagesInTableProbe(i));
//messagesSentTableTPExecSvc.execute(new MessagesSentTableProbe(i));
//retryTableTPExecSvc.execute(new RetryTableProbe(i));
}
/*
* prevent other tasks from being added to the queue
*/
messagesInTableTPExecSvc.shutdown();
//messagesSentTableTPExecSvc.shutdown()
//retryTableTPExecSvc.shutdown();
//ConnectionPoolProvider.getInstance().getDataSource().release();
}
}
答案 0 :(得分:6)
这意味着THREAD_POOL_SIZE
为0或负数。
来自Executors.newFixedThreadPool(int)
的文档:
<强>抛出:强>
IllegalArgumentException - if nThreads <= 0
解决方案显然是确保ConnectionPoolProvider.getInstance().getThreadPoolSize()
返回正数(至少为1)。你是如何做到的,我相信你最了解,因为这是你自己的代码。或者,如果提供者未提供有效值,您可以使用默认值(例如,1)。