Appu, the first one is a fairly simple one. You see when you initialize a thread with a runnable, then something like this happens inside the Thread class
Now when you call start on the Thread instance, the run method of Thread class is called. The run method looks like this
So basically the run method of the concrete Thread class is called who has the responsibility to call the run method of the runnable passed to the Thread constructor. In the example given by you, an instance of A class is created to instantiate the thread. Now when the start method is called, the run method of A class is called. It is the responsibility of run method of A class to call run method of the Runnable object passed to it during initialization. Since it doesn't fulfill that responsibility, so the run method B class is not called. A correct way to implement the run method would have been
The second question is also fairly simple. When you call run on a Thread instance, then a new thread is not started to execute the run method. Instead the run method is called in the current thread. A new thread is started only when you call start on a Thread instance. So in the run method of class B
new Thread(new A(),"T2").run();
will both call run method in the thread started in main method
new Thread(new B(),"T1").start();
Only the third call in run method of class B will a new thread be started
new Thread(new A(),"T3").start();
This is why the first two calls return T1 i.e. the name of the thread started in the main method...
Here we are calling start of class A and to its constructor you are passing B. So A's run mothod will run which prints A.
In the second example,
new Thread(new B(),"T1").start(); //Will call run method of B as follows
new A().run(); // will call run of class A and prints name of current thread T1
new Thread(new A(),"T2").run(); // will call run of A but will not start the new thread of execution(see run is calling directly) so prints the same name name T1
new Thread(new A(),"T3").start(); //will call run of A but will start the new thread of execution and print its name as T3.Hope it clears to you.