使用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(); } } } }