2

我已经根据此处的指南( 即实际的简单文件 IO 滴答代码)成功地将 java 服务部署到 Linux 发行版上,并且注意到这样一个简单程序的 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 参数。

我想除了 -server 选项之外,我可能还缺少一些东西。我被告知要查看 ScheduledExecutorService - 也许可以改进?

感谢您的想法 - 谢谢。

4

2 回答 2

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);
    }
}
于 2014-02-17T08:37:09.840 回答
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
            }

        }
于 2014-02-17T07:24:56.123 回答