来自Executors.newFixedThreadPool()

时间:2017-02-09 09:24:13

标签: java multithreading

  

线程“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();
    } 
}

1 个答案:

答案 0 :(得分:6)

这意味着THREAD_POOL_SIZE为0或负数。

来自Executors.newFixedThreadPool(int)的文档:

  

<强>抛出:

     

IllegalArgumentException - if nThreads <= 0

解决方案显然是确保ConnectionPoolProvider.getInstance().getThreadPoolSize()返回正数(至少为1)。你是如何做到的,我相信你最了解,因为这是你自己的代码。或者,如果提供者未提供有效值,您可以使用默认值(例如,1)。