Question

I want to write an tail like app. Now this app, scans a file for changes in the background and fires events in case something changed.

I want to run my application until the user requests to exit it by pressing ctrl + c (working by default). I do not want to create a lot of CPU load just by doing an endless while(true) loop like I'm doing ATM:

try {
        // thread doing the monitoring
        thread.start();

        // forcing the programm not to exit
        while (System.in.available() == 0) {
            Thread.sleep(5000);
        }

    } catch (final IOException e) {
        e.printStackTrace();
    }

Does anyone know a more elegant/the right approach for this?

Was it helpful?

Solution

I'm not sure why you are using a thread in the first place, the 'tail' unix script is simply a while(true) loop with no exit condition. It watches the file and prints changes if any is detected. I think by default it pauses 1 second, so basically:

while(true) {
   // Code goes here. Watch file, System.out.print if it changes

   Thread.sleep(1000);
}

No need for a thread. But to answer the question about the best way to keep your app alive: Simply don't return from the thread's run() method. You don't have to join the thread, the application will stay in the foreground as long as it has one non-daemon running thread.

OTHER TIPS

If you want to read the System.in without busy-waiting, that's very easy to achieve. InputStream has blocking semantics so all you need to to is call one of the read methods and it will block until there is input available. If you are scanning text input, I'd advise BufferedReader.readLine. Also, do that on the main thread, no point in starting another one.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top