线程的休眠
一种能控制线程行为的方法是调用sleep方法,sleep方法需要一个参数用于执行该线程休眠的时间,该时间以毫秒为单位,它通常是在run方法内的循环中被使用。
try{
Thread.sleep(2000)
}catch(InterruptedException e){
e.printStackTrace();
}
上述代码会使线程在2s之内不会进入就绪状态,由于sleep方法的执行有可能抛出InterruptedException异常,所以将sleep方法的调用放在try…chatch块中。虽然使用了sleep方法的线程在一段时间内会醒来,但是并不能保证它醒来后进入运行状态,只能保证它进入就绪状态。
我们来看一个小例子。
在这段代码中,程序每过一秒会输出一次变量的值,也就是10.可以看到sleep是放在run方法内的try…catch语句块中的。
线程的加入
如果当前某程序为多线程程序,假如存在一个线程A,现在需要插入线程B,比要求线程B先执行完毕,再继续执行线程A,此时可以使用Thread类中的join方法来完成,这就好比此时你正在玩电脑,你的外卖到了。你必须先去取外卖,然后再回来玩电脑。
当某个线程使用join方法加入另一个线程时,另一个线程会等待该线程执行完毕后再继续执行。
在本例中创建了两个线程A和B,并添加了计数器count当count的值等于5时,线程B调用join方法加入线程A。当线程B的if语句满足条件后,线程A继续执行。
线程的中断
以往有的时候会使用stop()方法停止线程,但JDK早已废除了stop方法,不建议使用stop方法来停止一个线程的运行,现在提倡在run方法中使用无线循环的方式,然后使用一个布尔型标记控制循环的停止。像上面的例子中,使用if语句规定了一个计数器,如果计数器满足条件,则会终止循环。
如果线程是因为使用了sleep或wait方法进入了就绪状态,可以使用Thread类中的interrupt方法使线程离开run方法,同时结束线程,但程序会抛出InterrputedException异常,用户可以再处理该异常时完成线程的中断业务处理。
在本例中,由于调用了interrupt方法,所以抛出了InterruptException异常。