sleep
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 | public class Thread1 implements Runnable {     private Test test;     public Thread1(Test test) {         this.test = test;     }     public void run() {         synchronized (test){             try{                 System.out.println("Thread1....");                 System.out.println("等待中");                                  Thread.sleep(3000);                 System.out.println("资源释放");             }catch (Exception e){             }         }     } }
 | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 | public class Thread2 implements Runnable {     private Test test;     public Thread2(Test test) {         this.test = test;     }     public void run() {         synchronized (test){             try{                 System.out.println("Thread2....");                                  Thread.sleep(3000);             }catch (Exception e){             }         }     } }
 | 
输出结果:
  Thread1….
    等待中
    资源释放
    Thread2….
结论:使用sleep进行线程等待时,占用系统资源
wait
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 | public class Thread1 implements Runnable {     private Test test;     public Thread1(Test test) {         this.test = test;     }     public void run() {         synchronized (test){             try{                 System.out.println("Thread1....");                                  System.out.println("进入等待中");                 test.wait();                 System.out.println("等待结束");             }catch (Exception e){             }         }     } }
 | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 | public class Thread2 implements Runnable {     private Test test;     public Thread2(Test test) {         this.test = test;     }     public void run() {         synchronized (test){             try{                 System.out.println("资源释放了");                 System.out.println("Thread2....");                                  test.notify();             }catch (Exception e){             }         }     } }
 | 
输出结果:
  Thread1….
    进入等待中
    资源释放了
    Thread2….
    等待结束
结论:使用wait进行线程等待时,不占用系统资源
join
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 | public final synchronized void join(long millis) throws InterruptedException {     long base = System.currentTimeMillis();     long now = 0;     if (millis < 0) {         throw new IllegalArgumentException("timeout value is negative");     }     if (millis == 0) {         while (isAlive()) {             wait(0);         }     } else {                  while (isAlive()) {             long delay = millis - now;             if (delay <= 0) {                 break;             }             wait(delay);             now = System.currentTimeMillis() - base;         }     } }
 | 
结论:
线程至多等待millis
  永久等待(如果millios=0),直到线程被唤醒