----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
package com.itcast.test2;
/**
* wait方法和sleep方法有什么作用,区别是什么?
* sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,
* 但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
* wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,
* 进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后
* 本线程才进入对象锁定池准备获得对象锁进入运行状态。)
* @author shandawang
*
*/
public class MultiThread {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new Thread1()).start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(new Thread2()).start();
}
private static class Thread1 implements Runnable
{
@Override
public void run() {
// TODO Auto-generated method stub
//由于这里的Thread1和下面的Thread2内部run方法要用同一对象作为监视器,我们这里不能用this,
//因为在Thread2里面的this和这个Thread1的this不是同一个对象。我们用MultiThread.class这个
//字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。
synchronized (MultiThread.class) {
System.out.println("enter thread1...");
System.out.println("thread1 is waiting");
try {
//释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的
//代码范围,另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。
MultiThread.class.wait();
} 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
{
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (MultiThread.class) {
System.out.println("enter thread2...");
System.out.println("thread2 notify other thread can release wait status..");
//由于notify方法并不释放锁, 即使thread2调用下面的sleep方法休息了500毫秒,但thread1仍然
//不会执行,因为thread2没有释放锁,所以Thread1无法得不到锁。
MultiThread.class.notify();
// System.out.println("thread2 is sleeping ten millisecond...");
System.out.println("thread2 is waiting, other thread can run now...");
try {
//Thread.sleep(10);
MultiThread.class.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread2 is going on...");
System.out.println("thread2 is being over!");
}
}
}
}
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------