Thread的善后工作
一个已经完成run()方法的thread是已经终结的,它不再是活跃的(isAlive()这个method会返回false)然而,thread对象本身可能还会带有其他有意义的作用或信息。只要其他还在运作中的对象持有对已经终结了的thread对象的引用,其他的thread就能够运行已经终结了的thread对象的相应的method来获得某些有意义的操作与信息。
如果代表已经终结thread的对象超出其生命周期的scope,则该thread对象就会被garbage collected.在某些平台上,这同时会有清理与该thread关联的占用的系统资源的效果。
一般来说,之后你就不应该再占据该thread的引用以便让该thread在终结时能够被垃圾回收。
注意:一个还要占据thread引用的理由是要判断该thread(及任务task)是否已经完成工作,那可以用join()这个方法来完成。
join()方法经常用在当有一个已经开始执行独立task的thread,且想知道是否该task已经完成时。
join()方法有个特点:join()方法会被block(阻塞)住直到调用它的那个thread对象执行完毕了它的run()方法为止,如果thread已经完成了它的run()那么,调用thread.join()
方法不会被阻塞,及join()方法就会立即返回。这意味着你可以任意地调用join()来观察thread是否已经终结。但要小心,join()方法调用经常会被block住直到thread的run()方法真正完成为止,由于性能和编程的优雅性的考虑你最好不要对thread一直使用join()方法来看它是否还在运行,建议使用thread.isAlive()方法来查看一个thread对象是否还在执行它的run()方法还是已经完成(终结了)。这要根据isAlive()的返回值来判断。