使用suspend的时候,目标线程会停下来,这时候还是没有释放之前持有的锁,仍然保持,其他的线程资源也就无法访问锁定资源,除非被挂起的线程恢复运行,对任何线程来说,它们想要恢复目标线程,但是同时也试图使用一个任何锁定的资源,这样就造成了死锁。所以使用一个标识来指示,如果线程应该挂起,那么就使用wait方法阻塞释放锁,如果应该恢复就使用notify唤醒重新启动线程。
例子:有两个线程,一个主线程,一个子线程,希望主线程循环10次后,再跳转到子线程循环10次,如此重复50次。看代码如下:
/**
*
*/
package com.te;
/**
* @author 绝影
*
*/
public class ThreadOrder {
public boolean identify=true;//线程应该挂起还是恢复的标志符号
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ThreadOrder().init();
}
public void init() {
new Thread(//子线程
new Runnable() {
public void run() {
for(int i=0;i<50;i++) {//循环50次
synchronized(ThreadOrder.class) {
if(identify) {//指示当前线程是否该挂起
try {
ThreadOrder.class.wait();//挂起否则也会和主线程抢锁
}catch(InterruptedException e) {
e.printStackTrace();
}
}
for(int i1=0;i1<10;i1++) {//循环十次
System.out.println(Thread.currentThread().getName()+"子线程执行的第"+i1+"次");
}
identify=true;//该表标识位
ThreadOrder.class.notify();
}
}
}
}
).start();
for(int j=0;j<50;j++) {
synchronized(ThreadOrder.class) {
if(!identify) {
try {
ThreadOrder.class.wait();//主线程挂起让子线程执行,否则它们和子线程去抢锁
}catch(InterruptedException e) {
e.printStackTrace();
}
}
for(int i1=0;i1<10;i1++) {//循环十次
System.out.println(Thread.currentThread().getName()+"主线程执行的第"+i1+"次");
}
identify=false;//该表标识位
ThreadOrder.class.notify();
}
}
}
}