我们在平时在学习的过程中都会看到sleep()和wait()的使用。
sleep()表示的是睡觉,就是按时间的不执行,然后时间到了就可以执行了。(当然也也可以被中断的)。
wait()也表示睡觉,但是是睡觉的等等,别人不叫醒他,它就睡觉下去了。
理解深点的,sleep()用的时候,是不释放对象锁的,而wait()是释放对象锁。这也是为了理解写本笔记的原因。
下面请看:
有一个公共资源类,两个线程都去调用这个类的一个方法,然后再man方法中进行测试。
首先我们来看使用wait()方法:
Resource类
package enduak;
public class Resoure {
public synchronized void printMsg (String msg) {
System.out.println(msg);
if (msg.equals("chenwei")) {
try {
<strong>Thread.sleep(10000) ;</strong>
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("-----");
}
}
线程1
package enduak;
public class Thread1 extends Thread{
private Resoure res = null;
public Thread1(Resoure res) {
this.res = res ;
}
public void run() {
res.printMsg("chenwei") ;
}
}
线程2
package enduak;
public class Thread2 extends Thread{
private Resoure res = null;
public Thread2(Resoure res) {
this.res = res ;
}
public void run() {
try {
Thread.sleep(1000) ;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
res.printMsg("chenweix") ;
}
}
main测试类
package enduak;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MainApp {
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool() ;
Resoure res = new Resoure();
Thread1 t1 = new Thread1(res ) ;
Thread2 t2 = new Thread2(res) ;
es.execute(t1) ;
es.execute(t2) ;
}
}
测试结果分析:
chenwei (等了好久,才打印出下面的)
-----
chenweix
-----
当使用sleep()的时候,线程是占用着资源的,其他的线程是不能用这个资源的,也就是说我们说的不释放对象锁的。
-------------------------------------------------
而当我们用wait()的方法的时候:
resource类
package enduak;
public class Resoure {
public synchronized void printMsg (String msg) {
System.out.println(msg);
if (msg.equals("chenwei")) {
try {
<strong>this.wait() ;</strong>
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("-----");
}
}
打印结果:
chenwei
chenweix
-----
线程还在那里等待着,释放掉了对象锁,其他的线程也可以使用对象的方法了的
转载于:http://endual.iteye.com/blog/1415271