sleep和wait区别
1,所属类与用途
sleep: 来自java.lang.Thread类,是一个静态方法,可让当前线程暂停执行指定的时间,主要用于线程的延迟操作,如定时任务,也可以防止线程过于频繁的占用cpu资源。
wait: 来自java.lang.Object类,是实例方法,用于线程间的协调和通信。当一个线程调用对象的wait方法时,该线程会释放该对象监视器(锁)的持有权,并进入等待状态。wait方法必须要搭配synchronized使用。
2,锁的处理–线程是否释放锁
sleep:睡眠期间不释放锁,睡眠结束,线程继续执行,不考虑其他线程的状态,
wait: 线程调用wait方法,会释放线程持有的锁,其他线程可以获得这个锁并继续执行,知道等待的线程被唤醒。
3,唤醒方式
sleep:睡眠时间结束,自动唤醒,不依赖其他线程。
wait:必须通过其他线程调用同一对象的notify或者notifyAll方法才能被唤醒,唤醒后需要重新竞争获得对象锁才能继续执行。
4,异常处理
sleep: 在java SE 1.5以后,Thread.sleep(long mills) 方法会抛出InterruptedException,需要被捕获处理
wait: 同样会抛出InterruptException,也需要被捕获处理。此外,如果不在synchronized代码块或方法中调用wait,则会抛出IllegalMonitorStateException。
总结
sleep方法主要用于线程自身的延时执行,不影响同步状态;而wait方法则用于线程间的协作,是并发编程中的重要工具,直接影响到线程同步与通信。
什么是实例方法(创建对象,然后调用方法)
在面向对象编程中,实例方法(Instance Method)是指在类中定义的、与特定对象关联的方法。当类的实例(对象)被创建后,实例方法可以通过该对象进行调用。实例方法可以访问类的实例变量,并且在执行时隐式地携带一个指向调用它的对象的引用,通常在方法的第一个参数中体现(在Java中习惯使用this关键字引用当前对象)。
在Java中,实例方法的定义格式如下:
修饰符 返回类型 方法名(参数列表) {
// 方法体
// 可以访问类的实例变量和调用其他实例方法
}
例如:
public class MyClass {
private int myVariable;
// 实例方法
public void setMyVariable(int value) {
this.myVariable = value; // 使用this关键字访问实例变量
}
public int getMyVariable() {
return this.myVariable; // 同样是实例方法,返回实例变量的值
}
}
// 使用实例方法
MyClass myObject = new MyClass();
myObject.setMyVariable(10); // 通过实例调用实例方法
int variableValue = myObject.getMyVariable(); // 再次通过实例调用另一个实例方法
实例方法与类方法(静态方法,static method)不同,类方法是与类而非类的实例关联的,可以直接通过类名调用,不依赖于任何特定对象的存在。