Thread's "start()" method calls the Thread's "run()" method. The default run() will look to see if the Thread was constructed with a Runnable as an argument; if so, it will call the Runnable's run(), or otherwise, just return.
You've overridden that default behavior to just print "1". The A object actually is not used for anything. start() calls B.run() which prints "1" and exits.