标签:对象 adt oca rac tar 暂停 his int exce
1.wait 属性Object类
sleep属性 Thread 类
首先写个demo 来看public class SleepTest {
public static void main(String[] args) {
ThreadOne one = new ThreadOne();
ThreadTwo two = new ThreadTwo();
one.start();
two.start();
}
}
class ThreadOne extends Thread{
public void run(){
try {
System.out.println("进入了sleep方法当前时间是"+new Date().toLocaleString());
sleep(1000);
System.out.println("sleep方法结束当前时间是"+new Date().toLocaleString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class ThreadTwo extends Thread{
public void run(){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
进入了sleep方法
进入了sleep方法当前时间是2018-7-26 11:24:50
sleep方法结束当前时间是2018-7-26 11:24:51
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.zz.www.Thread.ThreadTwo.run(SleepTest.java:30)
可以看出 sleep方法用法比较简单 但是 wait 方法 必须在synchronized 方法内使用;
修改一下ThreadTwo
class ThreadTwo extends Thread{
public void run(){
gogo();
}
public synchronized void gogo(){
try {
System.out.println("进入了wait方法 当前时间是"+new Date().toLocaleString());
this.wait(10000);//当前线程等待10000毫秒
System.out.println("wait方法结束 当前时间是"+new Date().toLocaleString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
再次运行结果为
进入了wait方法 当前时间是2018-7-26 11:25:50
进入了sleep方法当前时间是2018-7-26 11:25:50
sleep方法结束当前时间是2018-7-26 11:25:51
wait方法结束 当前时间是2018-7-26 11:26:00
2. notify(), notifyAll(),wait(), wait(long), wait(long, int)操作,都需要锁对象
例如 :
exapmle 1,锁定方法所属的实例对象:
public synchronized void method(){
//然后就可以调用:this.notify()...
//或者直接调用notify()...
}
exapmle 2,锁定方法所属的实例的Class:
public Class Test{
public static synchronized void method(){
//然后调用:Test.class.notify()...
}
}
exapmle 3,锁定其他对象:
public Class Test{
public Object lock = new Object();
public static void method(){
synchronized (lock) {
//需要调用 lock.notify();
}
}
}
标签:对象 adt oca rac tar 暂停 his int exce
原文地址:https://www.cnblogs.com/zjf6666/p/9370915.html