ScheduledExecutorService schedule = Executors.newScheduledThreadPool(int corePoolSize);
请问,schedule创建完毕后,线程池的数量可以改变吗?
我现在想改变,想让线程数目随着ScheduledExecutorService里面添加Runnable任务的多少的变化而变化。
请问怎么弄?如果直接用ScheduledThreadPoolExecutor schedulePool = new ScheduledThreadPoolExecutor(int corePoolSize,ThreadFactory factory);
那么,schedulePool里面线程的数量可以改变吗?
请问想改变的话怎么改变?
请问,schedule创建完毕后,线程池的数量可以改变吗?
我现在想改变,想让线程数目随着ScheduledExecutorService里面添加Runnable任务的多少的变化而变化。
请问怎么弄?如果直接用ScheduledThreadPoolExecutor schedulePool = new ScheduledThreadPoolExecutor(int corePoolSize,ThreadFactory factory);
那么,schedulePool里面线程的数量可以改变吗?
请问想改变的话怎么改变?
http://dongxuan.iteye.com/blog/901689http://dongxuan.iteye.com/blog/902571
发现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]
请问这个是怎么回事?