如果在上述代码的`main`方法中,将`ti.start();`移动到`ti.join();`或`ti.join(1);`语句之后,并且将`for`循环的`i`的结束条件改成`i < 10`, 那么下列关于程序行为的描述正确的是?
答案解析
本题考察线程生命周期以及`start()`和`join()`方法的使用。线程的`start()`方法必须在线程的`join()`方法之前调用,否则如果先调用了`join()`方法,则线程将无法启动。 `start()`方法启动一个线程,线程会执行`run()`方法。`join()`方法使当前线程等待另一个线程执行结束或超时,并不是在调用`join()`后启动线程。
A选项错误,`join()`方法调用时会先判断线程是否已经启动,若未启动,则主线程会一直阻塞等待,并不会抛出异常,但是此时t1线程一直不会启动,所以主线程会一直等待。
B选项正确,`ti.start()`放在`ti.join()`后面,导致`t1`线程不会启动,而此时`ti.join()`会让主线程一直阻塞,因此导致主线程一直等待,程序不能正常结束,因为在 `start()` 方法被调用之前,线程不会执行其 `run()` 方法中的代码。`join()` 方法调用时会判断线程是否已经启动,如果未启动会进入等待状态。
C选项错误,线程启动必须调用`start()`方法,当调用`join()`时,t1线程还未启动,主线程会进入等待状态,导致程序一直等待。
D选项错误,`join()`不是启动线程的方法,只有`start()`方法才会启动线程, `join()` 方法调用时会判断线程是否已经启动,如果未启动会进入等待状态,因此不会发生先调用`join`方法后才启动线程的情形。
正确答案:B