I learned that to start a thread the recommended way is to invoke start()
method on thread object. But this in turn invokes the run()
method. So why not directly invoke run() method?
Here's what I tried but I fail to bring any conclusion :
public class Tester {
public static void main (String[] args) {
Runner r = new Runner();
Thread t1 = new Thread(r, "Thread A(runnable)");
Thread t2 = new Thread(r, "Thread B(runnable)");
Thread s1 = new Strider("Thread C");
Thread s2 = new Strider("Thread D");
t1.run(); // t1.start();
t2.run(); // t2.start();
s1.run(); // s1.start();
s2.run(); // s2.start();
}
}
class Runner implements Runnable {
private int counter;
public void run() {
try {
for (int i = 0; i != 2; i++) {
System.out.println(Thread.currentThread().getName() + " Runnable: "
+ counter++);
Thread.sleep(1000);
}
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
class Strider extends Thread {
private int counter;
Strider(String name) {
super(name);
}
public void run() {
try {
for (int i = 0; i != 2; i++) {
System.out.println(Thread.currentThread().getName() + ": "
+ counter++);
Thread.sleep(1000);
}
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
OUTPUT (using start()) : varies
Thread A(runnable): 0
Thread C: 0
Thread B(runnable): 1
Thread D: 0
Thread B(runnable): 3
Thread D: 1
Thread A(runnable): 2
Thread C: 1
OUTPUT (using run()) : always remains same
main Runnable: 0
main Runnable: 1
main Runnable: 2
main Runnable: 3
main: 0
main: 1
main: 0
main: 1
Also kindly provide your opinion on why not to use run()
directly ?