javamultithreadingocpjpjava-threads

Java Thread object vs Running Thread


Hi i am studying and playing with thread in java. i read in a book that Thread object and Running Thread is not same thing.even the thread complete it's run method running thread goes into dead state i even check that with isAlive() method. i want to know that if both are different then the following code is not working as per i understand.

public class Main {

    public static void main(String[] args) throws ParseException {
        Student s = new Student();

        Thread t = new Thread(s);

        t.start();
        t.run();
        t.run();
        t.run();

        t.run();
        t.run();

    }
}

class Student implements Runnable {
    public void run() {

        try {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

it only shows this output. main Thread-0 main or this Thread-0 main

from this result i understand that after thread complete it's run method. Running thread goes into dead State and calling on Thread obj method no working.but i couldn't understand the reason behind because Thread object is skill reference and what about the other methods of Thread class. like yield()? start()?

here is another scenario for clear understanding what i said

public class Main {

    public static void main(String[] args) throws ParseException {
        Student s = new Student();

        Thread t = new Thread(s);

        t.start();

        if (!t.isAlive()) {

            t.start();
        }

    }
}

class Student implements Runnable {
    public void run() {

        try {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

documentation said if we call start method on Thread t object then it will throw java.lang.IllegalThreadStateException. but the above code working fine. i am very confused about which methods of Thread class rely on Running thread and which for thread object. i hope you understand the problem. thanks in advance?


Solution

  • Right after starting the thread by t.start(), this condition:

    if (!t.isAlive()) 
    

    is veeeeeeeeeeeeeeeeeeery unlikely to be met--because started thread doesn't block. That is why it just skips (because t.isAlive() == true) and goes further without an exception.