JSVC Java Daemon所需的性能改进

时间:2014-02-16 20:37:58

标签: java multithreading daemon scheduledexecutorservice jsvc

我已根据指南here成功将Java服务部署到Linux发行版上 即实际的简单文件IO tick-tock代码,并注意到这样一个简单程序的高CPU使用率。也许是由于线程不断检查...

我使用NetBeans在CentOS上构建了实际的JAR文件,然后部署到Arch Linux ARM发行版上,然后使用a)Oracle的Java SE Embedded JVM(v7)和b)java-7-openjdk JVM。

问题是jsvc的CPU使用率一直在80%到95%之间摇摆不定。 我不指望CPU会那么高。在实际的jsvc调用中,我尝试为后台进程添加-server参数 - 但是没有设法(我得到。这样做的一个例子会有所帮助,以便我们可以排除它是否是缺少的-server参数。 / p>

我想除了-server选项之外,我可能会遗漏一些东西。我被告知要查看ScheduledExecutorService - 这可能会有所改进吗?

感谢您的意见 - 谢谢。

2 个答案:

答案 0 :(得分:1)

所以在没有建议的情况下我添加了线程暂停并解决了问题。代码如下:

        @Override
        public void run() {                 

            while(!stopped){

                long now = System.currentTimeMillis();
                if(now - lastTick >= 10000){
                    System.out.println(!lastOneWasATick ? "tick" : "tock");
                    lastOneWasATick = !lastOneWasATick;
                    lastTick = now; 
                }

                //ADDED THIS BLOCK
                try {
                    Thread.sleep(15000);
                } catch (InterruptedException ex) {
                    //Logger.getLogger(JDaemon.class.getName()).log(Level.SEVERE, null, ex);
                }
                //END BLOCK
            }

        }

答案 1 :(得分:1)

根据你正在做的事情,Thread.sleep方法可能没问题,但我仍然建议使用ScheduledExecutorService.scheduleAtFixedRate()方法。它已经过全面测试,记录,并且将来可能需要维护代码的其他开发人员应该熟悉它。它还提供了取消执行的方法,例如管理多个任务。我仔细看看。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import static java.util.concurrent.TimeUnit.*;

public class Clock {

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private boolean lastOneWasATick = false;

    public void startClock() {

        //Define the task 
        final Runnable tickTock = new Runnable() {
            public void run() {
                System.out.println(!lastOneWasATick ? "tick" : "tock");
                lastOneWasATick = !lastOneWasATick;
            }
        };      

        //Schedule the task's execution at 1 second intervals, starting immediately
        final ScheduledFuture<?> tickTockThreadHandle = scheduler.scheduleAtFixedRate(tickTock, 0, 1, SECONDS);

        //Stop the clock after 1 minute
        scheduler.schedule(new Runnable() {
            public void run() {
                tickTockThreadHandle.cancel(true);
            }
        }, 60, SECONDS);
    }
}