线程中的阻塞出现的情况:
(1)通过sleep()使任务进入休眠转台,在这种情况下,任务在指定的时间内是不会运行的。
(2)使用wait() 使线程挂起,知道线程得到notify()或者notifyAll()消息。
(3)任务在等待某个输入或者输出
(4)任务试图在某个对象上调用其同步控制方法,但是锁不可用,因为另一个任务已经获取这个锁。
/**
* sleep中的阻塞
*/
class SleepBlocked implements Runnable{
@Override
public void run() {
try {
//时间转换
TimeUnit.SECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* IO 造成线程阻塞
*/
class IOBlocked implements Runnable{
private InputStream in;
@Override
public void run() {
System.out.println("请输入:");
try {
in.read();
} catch (IOException e) {
if(Thread.currentThread().interrupted()){
System.out.println("线程中断");
}else
e.printStackTrace();
}
}
}
/**
* 线程将锁让出去情况下阻塞
*/
class SynchronizedBlocked implements Runnable{
public synchronized void f(){
while(true){
Thread.yield();
}
}
public SynchronizedBlocked (){
new Thread(){
public void run(){
f();
}
}.start();
}
@Override
public void run() {
System.out.println("进入同步的:");
f();
System.out.println("线程同步结束");
}
}