0
点赞
收藏
分享

微信扫一扫

线程有哪些常用的调度方法?


线程有哪些常用的调度方法?_线程中断

一、线程等待

在Object类中有一些函数可以用于线程的等待:

1.1 wait()

当一个线程A调用一个共享变量wait()方法时,线程A会被阻塞挂起,发生以下情况才会返回:

(1)线程A调用了共享对象的notify()或者notifyAll()方法。

(2)其它线程调用了线程A的interrupt()方法,线程A抛出InterruptedException异常返回。

1.2 wait(long timeout)

这个方法比wait方法多了个超时参数,它的不同之处在于,如果线程A调用共享对象的wait(long timeout)方法后,没有在指定的timeout ms时间内被其它线程唤醒,那么这个方法还是会因为超时而返回。

1.3 wait(long timeout,int nanos)

其内部调用的是wait(long timeout)函数。

1.4 join()

Thread类也提供了一个方法用于等待的方法:

如果一个线程A执行了thread.join()语句,其含义是:当前线程A等待thread线程终止之后才从thread.join()返回。

二、唤醒线程

2.1 notify()

一个线程A调用共享对象的notify()方法后,会唤醒一个在这个共享变量上调用wait系列方法后被挂起的线程。一个共享变量上可能会有多个线程在等待,具体唤醒哪个等待线程都是随机的。

2.2 notifyAll()

不同于在共享变量上调用notifyAll()函数会被唤醒被阻塞到该共享变量上的一个线程,notifyAll()方法会唤醒所有在该共享变量上由于调用wait系列方法而被挂起的线程。

三、线程休眠

3.1 sleep()

Thread类中的静态方法,当一个执行中的线程A调用了Thread的sleep方法后,线程A会暂时让出指定时间的执行权,但是线程A所拥有的监视器资源,比如锁还是持有不让出的。

指定睡眠时间到了之后该函数会正常返回,接着参与CPU调度,获取到CPU资源后就可以接着继续运行。

四、让出优先权

yeild():Thread类中的静态方法,当一个线程调用yield方法时,实际上是在暗示线程调度器当前线程请求让出自己的CPU执行权,但是线程调度器可以选择是否接受或者忽略该请求。

五、线程中断

Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。

5.1 void interrupt()

中断线程,例如:当线程A运行时,线程B可以调用线程的interrupt()方法来设置线程的中断标志为true并立即返回。

设置标志仅仅是设置标志,线程A并没有被中断,会继续往下执行。

5.2 boolean isInterrupted()

检测当前线程是否被中断。

5.3 boolean interrupted()

检测当前线程是否被中断,与isInterrupted不同的是,该方法如果发现当前线程被中断,则会清除中断标志。

举报

相关推荐

0 条评论