读书人

java定时ThreadPool的scheduleAtFixed

发布时间: 2013-07-04 11:45:33 作者: rapoo

java定时ThreadPool的scheduleAtFixedRate函数问题
问题描述:使用ThreadPool的scheduleAtFixedRate函数做定时触发任务,在同一个触发时间点只会有一个线程会启动,但是现在遇到的问题是在一个触发时间点,同时启动了4个线程,
请问下各位大侠,在什么场景或情况下会出现在同一个触发时间点会起4个线程?

备注:在触发4个线程之前,scheduleAtFixedRate函数都是在同一个触发时间点,只会启动一个线程;
在触发4个线程之后 ,scheduleAtFixedRate函数都是在同一个触发时间点,只会启动一个线程;

threadPool.scheduleAtFixedRate(runnable,
getDelayTime(),
getExePeriods(),
TimeUnit.SECONDS);

各位大侠,紧急啊。
[解决办法]
1 Executors.newScheduledThreadPool(4); coresize =4
2 差不多同一时间启动了scheduleAtFixedRate,使用的统一runable对象。
可能只是一个场景,希望对你有帮助。


import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduleThreadTest {

/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService service = null;
try {
service = Executors.newScheduledThreadPool(4);
final Runnable myRunable = new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName());
}
};

service.scheduleAtFixedRate(myRunable, 0, 1, TimeUnit.SECONDS);
service.scheduleAtFixedRate(myRunable, 0, 1, TimeUnit.SECONDS);
service.scheduleAtFixedRate(myRunable, 0, 1, TimeUnit.SECONDS);
service.scheduleAtFixedRate(myRunable, 0, 1, TimeUnit.SECONDS);

service.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
} finally {
if (service != null) {
service.shutdown();


}
}
}
}


[解决办法]
引用:
刚才再仔细的分析了日志,问题是:只启动了一个线程,但是这个线程运行了4次run函数,再次请问各位高手,在什么情况下,一个线程在死亡前会运行4次run函数呢?

在线等待啊,紧急………………

core size 变为1, scheduleAtFixedRate调用了4次,那么这个线程就会在同一时间节点访问run 函数4次。

读书人网 >J2EE开发

热点推荐