简体   繁体   中英

Raspberry pi with java application high CPU usage

I have a java application running on my raspberry pi but it crashes most of the time. Whenever it crashes it usually has a very high CPU usage (> 100%) from java. How my application works: I have a RFID reader that reads tags and whenever a tag is read, a messageReceived method is called. That method stores the read tags in a specific set. Then I create a new thread which listens to a socket and while the socket is open and when the set has changed, the thread calls some javafx methods to open new screens. However, when I deploy the application to my raspberry pi, it crashes randomly and has a high CPU usage with java. Feel free to ask any questions if I forgot to explain anything .

Edit 1: my thread class. Edit 2: My question now is: why do I have such a high CPU usage and how can I fix it.

public class RFIDThread implements Runnable {
    /**
     * The socket for the connection to the LLRP Reader
     */
    private Socket socket;

    private JSONArray valid_tags;

    private JSONArray found_tags;

    private TagsListController controller;

    private RFIDSet rfidset;

    /**
     * Thread for constant reading of the stream
     * 
      * @param socket
      * @param controller
      * @param tags
     */
    public RFIDThread(Socket socket, TagsListController controller, JSONArray tags, RFIDSet rfidset) {
         this.socket = socket;
         this.controller = controller;
         this.rfidset = rfidset;
         this.found_tags = new JSONArray();
         this.valid_tags = tags;
    }


     /**
      * Runnable for this thread.
      * First get all the found tags from the xml controller
      * Then loop over the rfid set to find any new tags.
      * If there are any, display them.
      */
    @Override
    public void run() {
        CopyOnWriteArrayList<Tag> originalSet = new CopyOnWriteArrayList<>();
        originalSet.addAll(rfidset.getSet());
        boolean started = true;

        if (socket.isConnected()) {
            while (!socket.isClosed()) {
                CopyOnWriteArrayList<Tag> set = new CopyOnWriteArrayList<>();
                set.addAll(rfidset.getSet());
                if(started || !originalSet.equals(set)) {
                    started = false;
                    CopyOnWriteArrayList<String> found_set = new CopyOnWriteArrayList<>();
                    found_set.addAll(controller.found_tags_list.getItems());                                      

                    this.found_tags.clear();
                    this.found_tags.addAll(found_set);


                    for (Tag found_tag : set) {
                        if (found_tags.indexOf(found_tag.getId()) < 0) {
                            Integer index = valid_tags.indexOf(found_tag.getId());
                            if (index >= 0) {
                                Platform.runLater(() -> controller.showValid(found_tag.getId()));
                            } else {
                                Platform.runLater(() -> controller.showError(found_tag.getId()));
                            }

                            found_tags.add(found_tag.getId());

                            pause(5000);
                        }
                    }

                    originalSet = set;

                    pause(5000);
                }
            }
        }
    }


    /**
     * Close the socket
     */
    public void shutdown() {
       try {
           this.socket.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
    }

    private void pause(long ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Try moving the pause(5000); outside the if (started || !originalSet.equals(set)) { statement.

High cpu usage is usually a tight loop with no pause or I/O or waiting for stuff. In your case whenever the originalSet.equals(set) you will not pause.

You may prefer to just use:

                if (started || !originalSet.equals(set)) {
                    // ...
                } else {
                    pause(0);
                }

or similar.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM