标题取名可能有点让人家误会,好像搞起来我讲的是一些很深奥的问题,其实我主要讲的是几个方法,至于我讲的内容的准确性,我也很难保证,毕竟自己也是菜鸟,希望不会误导人家,但是,正因为我是菜鸟,所以我讲的可能会通俗易懂,让同样也是菜鸟的鸟,豁然开朗,好,废话不多说。


   先讲2个方法stop,suspend2个方法顾名思义 一个是停止线程,一个是挂起线程,但是他们有个共同点,他们都不释放对象锁,这样的话很容易造成死锁。为什么呢?

   

   当你正在执行该线程的run方法时,你用suspend或者stop方法后,线程被挂起,或者被停止,让其他线程运行,但是如果得到cpu的那个线程与你刚才挂起或停止的那个线程是同步关系,即运用了同一个对象锁的话,这个线程是无法运行的,因为刚才你把线程挂起或停止后,并未释放该对象锁,释放对象锁一个2种方法,一个是sychronized语句执行完成,在sychronized语句中调用对象锁的wait方法释放对象锁,显然调用了stop或者suspend后是无法满足上面2个的任意一个要求,所以对象锁不会被释放,该同步代码就进入了一个死锁的状态。所以早在jdk1.2中就不弃用了这2种方法。


   下面主要讲的是sleep和wait的区别,这个比较重要,我觉得面试可能会考的比较多。我也上网查了一下,感觉他们说的都比较晦涩,对于我们这么菜鸟级别的人来说,就比较难懂了,我也不敢说我搞的很懂,但我尽量用自己的话来讲,让大家看的不是那么辛苦。


   首先sleep是线程的方法,wait是object的方法,最重要的是调用了sleep后,运行的进程进入睡眠状态,让出cpu给其他进程,但是不释放对象锁。wait让出cpu,进入阻塞状态,释放对象锁。还有一个就是用唤醒,sleep用interrupt方法,wait用notify方法,前者是Thread方法后者是Object的方法。

唤醒后都进入可运行状态,等待调用。


下面有一段代码,帮助大家更好理解wait和sleep的区别,希望对大家有帮助。


public class MultiThread {

public static void main(String[] args) {

new Thread(new Thread1()).start();

try{

Thread.sleep(10);

}catch(InterruptedException e){

e.printStackTrace();

}

new Thread(new Thread2()).start();

}

private static class Thread1 implements Runnable{

public void run(){

synchronized(MultiThread.class){

System.out.println("enter thread1...");

System.out.println("thread is waiting");

try {

MultiThread.class.wait();

//wait释放对象锁,所以Thread2可以运行,如果改为Thread.sleep,那么Thread2就无法运行了

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("thread1 is going on..");

System.out.println("thread1 is being over!");

}

}

}

private static class Thread2 implements Runnable{

public void run(){

synchronized(MultiThread.class){

System.out.println("enter thread2...");

System.out.println("thread2 notify other can release wait status..");

MultiThread.class.notify();//唤醒wait的Thread1

System.out.println("thread2 is sleeping ten millisecond..");

try{

Thread.sleep(10);//sleep不释放对象锁,所以Thread1就算得到cpu也无法运行

}catch(InterruptedException e){

e.printStackTrace();

}

System.out.println("thread2 is going on...");

System.out.println("thread2 is being over!");

}

}

}

}


输出结果是:

enter thread1...

thread is waiting

enter thread2...

thread2 notify other can release wait status..

thread2 is sleeping ten millisecond..

thread2 is going on...

thread2 is being over!

thread1 is going on..

thread1 is being over!


我相信以大家的聪明才智一定能看懂滴,我就不做过多的解释了。