Java并发学习笔记(11)阻塞线程

阻塞指的是暂停一个线程的执行以等待某个条件发生.java实现阻塞的方式如下几种:

(1) 调用Thread.sleep()方法它已毫秒作为单位让该线程睡眠一段时间,到时间后会自行唤起线程.也可以使用TimeUnit.XX.sleep() XX是TimeUnit的常量代表休眠的时间单位具体查看JDK即可.

(2) 使用Thread的suspend() 和 resume() 方法 不过使用suspend方法会引起死锁,所以该方式已过时不介意使用

(3) 使用Thread的静态方法yield()方法.该方法会暂停当前线程,并且执行其他线程.但是注意.yield方法只是给cpu一种建议,这种建议就是我已经完成我总重要的方法了.可以执行其他线程了.但是注意CPU可不会100%听取这种建议

(4) 调用Object的wait() 和 notify()/notfyAll() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。 对wait和notify/notifyAll方法调用必须在synchronized方法或synchronized块中调用.调用如果不在synchronized方法内调用会抛出IllegalMonitorStateException运行时异常

a)   wait的可以做为一种条件-等待,当条件不满足时挂起线程:

i.   永远设置一个条件

ii.  永远在执行wait前先检查条件是否符合(条件使用在while中比较合适每次使用notify通知挂起线程继续执行前再检查一遍条件会)

iii.永远在循环中调用wait(while最佳)

iv.  构成条件的变量都是被锁保护的

b)   使用wait挂起的线程会形成一个等待队列,当使用notify会按挂起的顺序来唤起线程,使用notifyAll会使得线程以常规方式获取锁,synchronized是非公平的.

(5) 任务在等待某个输入输出完成.

(6) 任务试图在某个对象上调用同步方法(synchronized)但是对象锁不可用.

你可能感兴趣的:(Java并发学习笔记(11)阻塞线程)