本篇博客在上一篇博客的基础上,继续对多线程的基础进行探讨。在本篇博客中,咱们将涉及多线程的中经常使用函数的说明、高级线程类的使用。程序员
在上一篇博客中,咱们了解了线程的状态,而如何控制这些状态来对线程进行调度呢,答案便在接下来的内容中。多线程
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。值得注意的是:在线程休眠期间,不会释放锁。函数
可见,这是一个静态方法。它属于Thread类。spa
join是Thread类的一个方法,启动线程后直接调用,即join()的做用是:“等待该线程终止”。这里须要理解的就是该线程是指的主线程等待子线程的终止,也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。线程
为何要用join()方法呢? 在不少状况下,主线程生成并起动了子线程,若是子线程里要进行大量的耗时的运算,主线程每每将于子线程以前结束,可是若是主线程处理完其余的事务后,须要用到子线程的处理结果,也就是主线程须要等待子线程执行完成以后再结束,这个时候就要用到join()方法了。对象
如下图为演示代码:事务
在没有使用join方法的状况下:博客
------------------------------------------------------------------------------------------------------it
运行结果:io
使用join方法后:
---------------------------------------------------------------------------------------------------
运行结果:
Thread.yield()方法做用是:暂停当前正在执行的线程对象,并执行其余线程。
yield()应该作的是让当前运行线程回到可运行状态(runnable),以容许具备相同优先级的其余线程得到运行机会。所以,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。实际上,yield()方法对应了以下操做:先检测当前是否有相同优先级的线程处于同可运行状态,若有,则把 CPU 的占有权交给此线程,不然,继续运行原来的线程。因此yield()方法称为“退让”,它把运行机会让给了同等优先级的其余线程
实际中没法保证yield()达到让步目的。由于当让步的程序回到可运行状态的时候,也有可能会被CPU选中执行,由于CPU在选择某一个线程的时候随机的。
设置线程的优先级(值在1-10之间),在Thread中有三个常数,分别为:
MIN_PRIORITY = 1
NORM_PRIORITY = 5
MAX_PRIORITY = 10
若是一个线程处于了阻塞状态(如线程调用了thread.sleep、thread.join、thread.wait、1.5中的condition.await、以及可中断的通道上的 I/O 操做方法后可进入阻塞状态),则在线程在检查中断标示时若是发现中断标示为true,则会在这些阻塞方法(sleep、join、wait、1.5中的condition.await及可中断的通道上的 I/O 操做方法)调用处抛出InterruptedException异常,而且在抛出异常后当即将线程的中断标示位清除,即从新设置为false。抛出异常是为了线程从阻塞状态醒过来,并在结束线程前让程序员有足够的时间来处理中断请求。
注,synchronized在获锁的过程当中是不能被中断的,意思是说若是产生了死锁,则不可能被中断。与synchronized功能类似的reentrantLock.lock()方法也是同样,它也不可中断的,即若是发生死锁,那么reentrantLock.lock()方法没法终止,若是调用时被阻塞,则它一直阻塞到它获取到锁为止。可是若是调用带超时的tryLock方法reentrantLock.tryLock(long timeout, TimeUnit unit),那么若是线程在等待时被中断,将抛出一个InterruptedException异常,这是一个很是有用的特性,由于它容许程序打破死锁。你也能够调用reentrantLock.lockInterruptibly()方法,它就至关于一个超时设为无限的tryLock方法
代码演示1:
-------------------------------------------------------------------------------------------------------------
运行结果:
如运行结果所示,当调用Thread.interrupt()后,Thread.sleep()会抛出一个InterruptedExamption异常,但线程并不会结束。但若是要使程序结束,能够这样作:
演示代码2:
-------------------------------------------------------------------------------------------------------------
运行结果:
未完成..........