理论教育 Java程序设计-线程插队

Java程序设计-线程插队

时间:2023-10-18 理论教育 版权反馈
【摘要】:创建一个自定义线程EmergencyThread,该线程执行for循环输出1到10。图12.14程序运行结果从图12.14的运行结果可以看出,线程main在输出到2时,运行线程1插队执行3000毫秒。当3000毫秒插队时间结束之后,线程main进入可执行状态,等待调度程序调度执行。

Java程序设计-线程插队

线程插队指的是当前正在运行的线程A运行其他线程B,使其插队执行,线程A进入等待状态,等待线程B执行一段时间或者是执行完毕之后再开始重新进入可执行状态。

线程插队可以通过Thread类提供的join()方法来实现,该方法在线程A运行过程中,由线程B来调用。join()方法提供带参数和不带参数两种形式。

1.public final void join() throws InterruptedException

如在线程A中存在B.join(),表示将线程B加入线程A的执行过程中,并让线程A等待,直到线程B执行完毕后线程A再进入可执行状态。如果线程A在等待过程中发现中断标志位为true,将抛出java.lang.InterruptedException异常。

2.public final void join(long millis) throws InterruptedException

该方法与上一个方法类似,但在参数列表中需要传递一个单位为毫秒的long型数据,表示将线程加入其他线程的执行过程中,并让其他线程等待millis毫秒。如果millis为0,则表示其他线程要一直等待,直到当前线程执行完毕,相当于join()方法。如果线程A在等待过程中发现中断标志位为true,将抛出java.lang.InterruptedException异常。

说明:

对于join(long millis)方法来说,如果插队的线程执行时间小于millis毫秒,那么线程插队线程执行完毕之后,被插队的线程将立即进入可执行状态,而不会一直等待millis毫秒。

【例12.7】创建一个自定义线程EmergencyThread,该线程执行for循环输出1到10。main线程中创建EmergencyThread线程的实例t,并启动线程。另外,main线程中也同样执行for循环输出1到10,当输出到2时,调用t.join(3000)方法为线程t让步3000毫秒。

在cn.pzhu.op包下创建一个名为ThreadJoin的类,关键代码如下:(www.daowen.com)

运行上述代码,程序运行结果如图12.14所示。

图12.14 程序运行结果

从图12.14的运行结果可以看出,线程main在输出到2时,运行线程1插队执行3000毫秒。然后,线程1执行3000毫秒(在这段时间内,线程1每隔500毫秒输出一次,因此输出3到8)。当3000毫秒插队时间结束之后,线程main进入可执行状态,等待调度程序调度执行。

说明:

如果将代码中的t.join(3000)修改为t.join(),那么线程1执行完毕之后,线程main才会执行。另外,如果将等待时间修改得很长,如30000毫秒,那么线程main并不会真的等待30000毫秒,而是在线程1执行完毕之后立即开始执行。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈