Files
2026-06-05 14:06:29 +03:30

2.2 KiB
Raw Permalink Blame History

Answers to Theoretical Questions

1. start() vs run()

Output:

Calling run()
Running in: main
Calling start()
Running in: Thread-2
  • When we call run() directly, it's just a normal method call.
    No new thread is created everything happens inside the current thread (here main).
    That's why the printed thread name is main.

  • Calling start() actually creates a brand new thread and then runs run() inside that new thread.
    So the output shows that Thread-2 is the one executing the code.

  • The main difference:
    run() → synchronous, runs in the caller thread.
    start() → asynchronous, spawns a separate thread and runs run() there.


2. Daemon Threads

Program output (when setDaemon(true) is used):

Main thread ends.
Daemon thread running...

(Only a few lines might appear before the program exits.)

  • By marking the thread as a daemon, we tell the JVM: "This thread is doing background work don't wait for it."
    As soon as all user threads finish, the JVM shuts down, even if daemon threads are still running.
    Here main is a user thread, so after it prints its message and ends, the program terminates quickly.

  • If we remove thread.setDaemon(true), the thread becomes a normal user thread.
    Then the JVM will wait for it to finish all 20 iterations before exiting.
    We'd see "Daemon thread running..." printed 20 times.

  • Reallife examples of daemon threads:

    • The garbage collector in Java runs in the background but won't stop the JVM from closing.
    • Autosave in a text editor saves periodically but shouldn't block the program from closing.

3. A shorter way to create threads

Output:

Thread is running using a ...!
  • The () -> { ... } part is a lambda expression.
    It's a compact way to write an anonymous function.

  • Instead of creating a whole new class that implements Runnable (or extending Thread), we can just pass the body of run() directly inside new Thread(...).
    This makes the code much shorter and easier to read, especially for oneoff tasks.

  • Lambdas are perfect for simple jobs, but if the task is complex or needs to be reused, a separate class might be better.