Home > OS >  Only one thread appears to be active at once
Only one thread appears to be active at once

Time:10-12

I'm attempting to start another thread that branches from the main thread when thread.start() is called. But it appears to take the main thread in to the thread class. Here is minimum reproducible code of my issue. Thanks for looking.

public class Main {

    public static void main(String[] args) throws InterruptedException {
        ThreadWhileLoop threadWhileLoop = new ThreadWhileLoop();
        //threadWhileLoop.run();
        threadWhileLoop.start();
        while (true){
            Thread.sleep(1000);
            System.out.println("Main Thread is doing its thing");
        }
    }
}

and here is the extended thread class

public class ThreadWhileLoop extends Thread {

    @Override
    public synchronized void start() {
        super.start();
        while (true){
            System.out.println("ThreadWhileLoopIsRunning");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void run() {
        super.run();
        while (true){
            System.out.println("ThreadWhileLoopIsRunning");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Expected output:

ThreadWhileLoopIsRunning
Main Thread is doing its thing
ThreadWhileLoopIsRunning
Main Thread is doing its thing
ThreadWhileLoopIsRunning
Main Thread is doing its thing

Actual output:

ThreadWhileLoopIsRunning
ThreadWhileLoopIsRunning
ThreadWhileLoopIsRunning

CodePudding user response:

Don’t override start. The start method is used by the calling thread to get the new thread into a runnable state. There are very few good reasons to override it. In your posted code the whole program is running in the main thread.

What you need to do is override the run method in the new thread. Then have the main thread call start, which will cause the run method to execute in a separate thread.

(It would be better to create a Runnable than to override Thread. You can pass the Runnable into the Thread as a constructor argument. With this approach there is less temptation to tamper with the Thread object.)

You can check what thread is running with

System.out.println(Thread.currentThread().getName());

In another answer I have an example of starting a thread using a Runnable: https://stackoverflow.com/a/5915306/217324

  •  Tags:  
  • java
  • Related