问题描述:使用ThreadPool的scheduleAtFixedRate函数做定时触发任务,在同一个触发时间点只会有一个线程会启动,但是现在遇到的问题是在一个触发时间点,同时启动了4个线程,
请问下各位大侠,在什么场景或情况下会出现在同一个触发时间点会起4个线程?备注:在触发4个线程之前,scheduleAtFixedRate函数都是在同一个触发时间点,只会启动一个线程;
      在触发4个线程之后  ,scheduleAtFixedRate函数都是在同一个触发时间点,只会启动一个线程;    threadPool.scheduleAtFixedRate(runnable,
            getDelayTime(),
           getExePeriods(),
            TimeUnit.SECONDS);各位大侠,紧急啊。

解决方案 »

  1.   

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

  2.   

    刚才再仔细的分析了日志,问题是:只启动了一个线程,但是这个线程运行了4次run函数,再次请问各位高手,在什么情况下,一个线程在死亡前会运行4次run函数呢?在线等待啊,紧急………………
      

  3.   

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

  4.   

    public static void main(String[] args)
            throws InterruptedException
        {
            ScheduledExecutorService service = null;
            try
            {
                service = Executors.newScheduledThreadPool(1);
                final Runnable myRunable = new Runnable()
                {
                    public void run()
                    {
                        System.out.println(Thread.currentThread().getName());
                    }
                };
                
                service.scheduleAtFixedRate(myRunable, 0, 1, TimeUnit.SECONDS);
                
                service.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
            }
            finally
            {
                if (service != null)
                {
                    service.shutdown();
                }
            }
        }
    像这种的代码,我遇到的就是在同一个触发周期内启动了4个线程。所以就想问下,在什么情况会出现这种呢?都搞了2天了,暂时还没头绪。
      

  5.   


    我又没你的代码,这里只是一个例子,说明一下有可能的情况而已,你需要结合自己的代码,log分析。
      

  6.   

    tomcat的时间跳变会不会造成这种问题呢?