Java Thread将CPU驱动到100%

时间:2014-09-02 14:13:44

标签: java multithreading csv

我已经多次重写了这段时间,但我暂时找不到解决这个问题的方法。其他一些类使用以下行写 gps.log 文件:

2014-09-02 10:23:13    35.185604    33.859077
2014-09-02 10:23:18    35.185620    33.859048

我正在尝试读取文件的最后一行并更新用户界面中的文本字段。下面的Thread将CPU过载到85-100%。 我保持文件很小(100行 - <5KB)。我已经使用CSV很长一段时间了,我认为每3秒读一次这个文件不应该在CPU上占用这个空间。虽然我过去一直在阅读巨大的CSV文件,但现在我第一次遇到这个问题,我每隔几秒就会尝试更新一次用户界面。我是如何更新文本字段的?有任何想法吗? 谢谢你的期待。

new Thread(new Runnable() {
    public void run() {

        while (true) {       
            Display.getDefault().asyncExec(new Runnable() {
                    public void run() {
                        try {
                            try { Thread.sleep(3000); } catch (Exception e) { }

                            BufferedReader gpslog = new BufferedReader(new FileReader("log/gps.log"));
                            String line = "";
                            String lastLine = "";
                            int i=0;
                            while (line != null) {
                                i++;
                                lastLine = line;
                                line = gpslog.readLine();
                            }
                            //System.out.println(lastLine);
                            gpslog.close();
                            if (lastLine != null) { txtGPSStatus.setText(lastLine); }
                            //If more than 100 gps entries, flush the file
                            if (i>100) {
                                PrintWriter writer = new PrintWriter("log/gps.log");
                                writer.close();
                            }

                        } catch (IOException e1) {
                            log.error(e1);
                        } 
                    }
            });
        }
    }
}).start();

2 个答案:

答案 0 :(得分:0)

移动

尝试{Thread.sleep(3000); } catch(例外e){}

所以它就在

之后

while(true){

然后你会跑步,等待3秒,跑步等等。

答案 1 :(得分:0)

您应该清楚了解后台线程应该做什么以及UI线程的用途!

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
    public void run() {
        try {
            while (true) {
                updateLog();
                Thread.sleep(3000);
            }
        } catch (InterruptedException ex) {
            // restore interruption flag
            Thread.currentThread().interrupt();
        }
    }
});

private void updateLog() {
    String lastLine = readLastLogLine();
    Display.getDefault().syncExec(new Runnable() {
        public void run() {
            txtGPSStatus.setText(lastLine);
        }
    });
}