ScheduledExecutorService schedule = Executors.newScheduledThreadPool(int corePoolSize);
请问,schedule创建完毕后,线程池的数量可以改变吗?
我现在想改变,想让线程数目随着ScheduledExecutorService里面添加Runnable任务的多少的变化而变化。
请问怎么弄?如果直接用ScheduledThreadPoolExecutor schedulePool = new ScheduledThreadPoolExecutor(int corePoolSize,ThreadFactory factory);
那么,schedulePool里面线程的数量可以改变吗?
请问想改变的话怎么改变?

解决方案 »

  1.   

    http://dongxuan.iteye.com/blog/901689http://dongxuan.iteye.com/blog/902571
      

  2.   

    setCorePoolSize()另外有两篇文章不错:
    http://dongxuan.iteye.com/blog/901689http://dongxuan.iteye.com/blog/902571
      

  3.   

    谢谢楼上两位。
    发现ScheduledThreadPoolExecutor的一个问题,不知道是不是我使用错误。
    import java.util.concurrent.ScheduledThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;import org.apache.log4j.Logger;public class ScheduledTest { public static void main(String[] args) { ScheduledThreadPoolExecutor schedule = new ScheduledThreadPoolExecutor(1);
    schedule.scheduleAtFixedRate(new TaskRunnable("T1"), 0, 5, TimeUnit.SECONDS);//任务1,每隔5秒执行一次
    schedule.scheduleAtFixedRate(new TaskRunnable("T2"), 0, 5, TimeUnit.SECONDS);//任务2,每隔5秒执行一次
    schedule.scheduleAtFixedRate(new TaskRunnable("T3"), 0, 5, TimeUnit.SECONDS);//任务3,每隔5秒执行一次


    try {
    Thread.sleep(18000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    schedule.setCorePoolSize(3);
    }}class TaskRunnable implements Runnable {
    private static final Logger logger = Logger.getLogger(TaskRunnable.class.getName());
    private String id; public TaskRunnable(String id) {
    this.id = id;
    } @Override
    public void run() {
    logger.info(this.id + "--" + Thread.currentThread()); try {
    Thread.sleep(3000);//任务每次执行需要三秒的时间
    } catch (InterruptedException e) {
    logger.error(e);
    }
    }
    };运行结果如下图:
    [2012-01-13 13:01:11:906] [INFO ] -T1--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:01:14:906] [INFO ] -T2--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:01:17:906] [INFO ] -T3--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:01:20:906] [INFO ] -T1--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:01:23:906] [INFO ] -T2--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:01:26:906] [INFO ] -T3--Thread[pool-1-thread-1,5,main]
    ----------------18 senonds------------------
    [2012-01-13 13:01:29:906] [INFO ] -T1--Thread[pool-1-thread-2,5,main]
    [2012-01-13 13:01:29:906] [INFO ] -T2--Thread[pool-1-thread-3,5,main]
    [2012-01-13 13:01:29:906] [INFO ] -T3--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:01:32:906] [INFO ] -T2--Thread[pool-1-thread-3,5,main]
    [2012-01-13 13:01:32:906] [INFO ] -T1--Thread[pool-1-thread-2,5,main]
    [2012-01-13 13:01:32:906] [INFO ] -T3--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:01:35:906] [INFO ] -T1--Thread[pool-1-thread-2,5,main]
    [2012-01-13 13:01:35:906] [INFO ] -T2--Thread[pool-1-thread-3,5,main]
    [2012-01-13 13:01:35:906] [INFO ] -T3--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:01:38:906] [INFO ] -T1--Thread[pool-1-thread-2,5,main]
    [2012-01-13 13:01:38:906] [INFO ] -T2--Thread[pool-1-thread-3,5,main]
    [2012-01-13 13:01:38:906] [INFO ] -T3--Thread[pool-1-thread-1,5,main]18秒前,一个线程执行三个任务,每个任务间隔5秒,但是每个任务耗时5秒。
    一个线程需要串行执行这三个任务,三个任务执行一圈需要9秒,大于每个任务的触发间隔时间5秒。
    所以,这段时间内,每个任务的真正执行的触发间隔时间是9秒。18秒后,增加为3个线程,可以看到,T1,T2,T3三个任务是由三个线程来分别执行的。
    按理来说,应该是每个线程执行一个任务耗时3秒后,还有2秒富余,所以应该是5秒触发一次。
    可是看上面打印的日志来看,任务的触发间隔时间是3秒!!如果我把代码改一下,初始线程池的时候线程数目为1,添加三个任务,然后立马在主线程里面把线程池数目改为3,就不会出现这个问题。
    就是把上面的
    try {
    Thread.sleep(18000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    这段代码去掉。
    程序一启动,三个任务分别有三个线程来执行,触发间隔是5秒,一切正常。
    如下图所示:
    [2012-01-13 13:10:17:968] [INFO ] -T1--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:10:17:968] [INFO ] -T2--Thread[pool-1-thread-3,5,main]
    [2012-01-13 13:10:17:968] [INFO ] -T3--Thread[pool-1-thread-2,5,main]
    [2012-01-13 13:10:22:968] [INFO ] -T2--Thread[pool-1-thread-1,5,main]
    [2012-01-13 13:10:22:968] [INFO ] -T3--Thread[pool-1-thread-2,5,main]
    [2012-01-13 13:10:22:968] [INFO ] -T1--Thread[pool-1-thread-3,5,main]
    [2012-01-13 13:10:27:968] [INFO ] -T1--Thread[pool-1-thread-2,5,main]
    [2012-01-13 13:10:27:968] [INFO ] -T2--Thread[pool-1-thread-3,5,main]
    [2012-01-13 13:10:27:968] [INFO ] -T3--Thread[pool-1-thread-1,5,main]
    请问这个是怎么回事?