线程的控制包括线程的启动、挂起、状态检查以及如何正确结束线程,由于在程序中使用多线程,为合理安排线程的执行顺序,可以对线程进行相应的控制。
一个新的线程被创建后处于初始状态,实际上并没有立刻进入运行状态,而是处于就绪状态,当轮到这个线程执行时,即进入“可执行”状态,开始执行线程run()方法中的代码。
执行run()方法是通过调用Thread类中start()方法来实现的。调用start()方法启动线程的run()方法不同于一般的调用方法,一般方法必须等到方法执行完毕才能够返回。
而对于start()方法来说,调用线程的start()方法后,start()方法告诉系统该线程准备就绪并可以启动run()方法后,就返回,并继续执行调用start()方法下面的语句,这时run()方法可能还在运行,这样,就实现了多任务操作。
线程的挂起操作实质上就是使线程进入“非可执行”状态下,在这个状态下,CPU不会分给线程时间段,进入这个状态可以用来暂停一个线程的运行,在线程挂起后,可以通过重新唤醒线程来使之恢复运行。这个过程在外表看来好像什么也没有发生过,只是线程很慢地执行一条指令。
当一个线程进入“非可执行”状态,也就是挂起状态时,必然存在某种原因使其不能继续运行,这些原因可能是如下几种情况。
(1)通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。
(2)通过调用join()方法使线程挂起,如果线程A调用线程B的join()方法,那么线程A将被挂起,直到线程B执行完毕为止。
(3)通过调用wait()方法使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。
(4)线程在等待某个输入/输出完成。