public class Bird1 {
private String name = "啄木鸟";
private String sex = "雄性";
@Override
public String toString() {
return "Bird [name=" + name + ", sex=" + sex + "]";
}
}
public class Bird2 {
private String name;
private String sex;
}
public class Main {
public static void main(String[] args) {
// com.company.Bird2@2503dbd3
Bird2 bird2 = new Bird2();
System.out.println(bird2);
System.out.println(bird2.toString());
// Bird [name=啄木鸟, sex=雄性]
Bird1 bird1 = new Bird1();
System.out.println(bird1);
System.out.println(bird1.toString());
}
}
1-7 notify / notifyAll
唤醒等待对象监视器的线程
public final native void notify();
public final native void notifyAll();
1-8 wait
源码,让线程进入等待,有3个重载的方法
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
public class Main {
public static void main(String[] args) {
Car bmw = new Car("宝马");
// 此时bmw对象就是一个垃圾,垃圾回收器就会回收(销毁)对象(就是释放它的堆内存,可以腾出来给别的对象用)
// 在销毁对象前,会调用该对象的finalize方法
// 程序员可以在finalize方法中,写自己的业务逻辑代码(比如释放资源: 数据库连接,or打开的文件...)
// 如果程序员不重写finalize方法,那么就会调用Object类的finalize方法,即默认处理(Object类的finalize方法是什么也不干的,即Object类只是提供了这样一个机制,但并没有做实事)
// 如果程序员重写finalize方法,就可以实现自己的逻辑
bmw = null;
System.gc(); //主动调用垃圾回收器
System.out.println("程序退出了...");
}
}
public class Car {
private String name;
public Car(String name) {
this.name = name;
}
//重写finalize方法
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize: " + name);
}
}
验证结果
程序退出了...
finalize: 宝马
2、源码翻译
wait/notify部分翻译的不是很懂,待后续研究线程锁相关
package java.lang;
/**
* Class {@code Object} is the root of the class hierarchy.
* Every class has {@code Object} as a superclass. All objects,
* including arrays, implement the methods of this class.
*
* Object类是类层次结构的根。 每个类都把Object作为超类。 所有对象(包括数组)都实现了这个类的方法。
*/
public class Object {
// 调用本地方法注册
private static native void registerNatives();
static {
registerNatives();
}
/**
* Returns the runtime class of this {@code Object}. The returned
* {@code Class} object is the object that is locked by {@code
* static synchronized} methods of the represented class.
* 返回此Object的运行时类。 返回的类对象是被表示类的static synchronized方法锁定的对象。
*
* <p><b>The actual result type is {@code Class<? extends |X|>}
* where {@code |X|} is the erasure of the static type of the
* expression on which {@code getClass} is called.</b> For
* example, no cast is required in this code fragment:</p>
*
*
* 实际结果的类型是Class<? extends |X|>,其中|X|是静态类型上其表达的擦除getClass被调用。
* 例如,在此代码片段中不需要转换:
*
* <p>
* {@code Number n = 0; }<br>
* {@code Class<? extends Number> c = n.getClass(); }
* </p>
*
* @return The {@code Class} object that represents the runtime
* class of this object.
* @jls 15.8.2 Class Literals
*/
public final native Class<?> getClass();
/**
* Returns a hash code value for the object. This method is
* supported for the benefit of hash tables such as those provided by
* {@link java.util.HashMap}.
* 返回对象的哈希码值。 支持这种方法是为了散列表,如HashMap提供的那样 。
*
* <p>
* The general contract of {@code hashCode} is:
* hashCode的总合同是:
* <ul>
* <li>Whenever it is invoked on the same object more than once during
* an execution of a Java application, the {@code hashCode} method
* must consistently return the same integer, provided no information
* used in {@code equals} comparisons on the object is modified.
* This integer need not remain consistent from one execution of an
* application to another execution of the same application.
* 在执行1个Java应用程序时,在同一个对象上调用该方法多次, hashCode方法必须始终返回相同的整数,
* 前提是修改了对象中equals比较中的信息。
* 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。
*
* <li>If two objects are equal according to the {@code equals(Object)}
* method, then calling the {@code hashCode} method on each of
* the two objects must produce the same integer result.
* 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果
*
* <li>It is <em>not</em> required that if two objects are unequal
* according to the {@link Object#equals(Object)}
* method, then calling the {@code hashCode} method on each of the
* two objects must produce distinct integer results. However, the
* programmer should be aware that producing distinct integer results
* for unequal objects may improve the performance of hash tables.
*
* 不要求如果两个对象根据equals(java.lang.Object)方法不相等,
* 那么在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。
* 但是,程序员应该意识到,为不等对象生成不同的整数结果可能会提高哈希表的性能。
* </ul>
* <p>
* As much as is reasonably practical, the hashCode method defined by
* class {@code Object} does return distinct integers for distinct
* objects. (This is typically implemented by converting the internal
* address of the object into an integer, but this implementation
* technique is not required by the
* Java™ programming language.)
* 尽可能多的合理实用,由类别Object定义的hashCode方法确实为不同对象返回不同的整数。
* (这通常通过将对象的内部地址转换为整数来实现,但Java的编程语言不需要此实现技术。)
*
* @return a hash code value for this object. 该对象的哈希码值
* @see Object#equals(Object)
* @see System#identityHashCode
*/
public native int hashCode();
/**
* Indicates whether some other object is "equal to" this one.
* 表示一些对象是否等于这个
* <p>
* The {@code equals} method implements an equivalence relation
* on non-null object references:
* equals方法在非空对象引用上实现等价关系
* <ul>
* <li>It is <i>reflexive</i>: for any non-null reference value
* {@code x}, {@code x.equals(x)} should return
* {@code true}.
* 自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。
*
* <li>It is <i>symmetric</i>: for any non-null reference values
* {@code x} and {@code y}, {@code x.equals(y)}
* should return {@code true} if and only if
* {@code y.equals(x)} returns {@code true}.
* 对称性 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)回报true 。
*
* <li>It is <i>transitive</i>: for any non-null reference values
* {@code x}, {@code y}, and {@code z}, if
* {@code x.equals(y)} returns {@code true} and
* {@code y.equals(z)} returns {@code true}, then
* {@code x.equals(z)} should return {@code true}.
* 传递性 :对于任何非空引用值x , y和z ,如果x.equals(y)回报true个y.equals(z)回报true ,然后x.equals(z)应该返回true 。
*
* <li>It is <i>consistent</i>: for any non-null reference values
* {@code x} and {@code y}, multiple invocations of
* {@code x.equals(y)} consistently return {@code true}
* or consistently return {@code false}, provided no
* information used in {@code equals} comparisons on the
* objects is modified.
* 一致性 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false ,没有设置中使用的信息equals比较上的对象被修改。
*
* <li>For any non-null reference value {@code x},
* {@code x.equals(null)} should return {@code false}.
* 对于任何非空的参考值x , x.equals(null)应该返回false 。
* </ul>
* <p>
* The {@code equals} method for class {@code Object} implements
* the most discriminating possible equivalence relation on objects;
* that is, for any non-null reference values {@code x} and
* {@code y}, this method returns {@code true} if and only
* if {@code x} and {@code y} refer to the same object
* ({@code x == y} has the value {@code true}).
* 该equals类方法Object实现对象上差别可能性最大的相等关系;
* 也就是说,对于任何非空的参考值x和y ,当且仅当x和y引用相同的对象( x == y具有值true )时,该方法返回true 。
*
* <p>
* Note that it is generally necessary to override the {@code hashCode}
* method whenever this method is overridden, so as to maintain the
* general contract for the {@code hashCode} method, which states
* that equal objects must have equal hash codes.
* 请注意,无论何时覆盖该方法,通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。
*
* @param obj the reference object with which to compare.
* 与之比较的参考对象
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);
}
/**
* Creates and returns a copy of this object. The precise meaning
* of "copy" may depend on the class of the object. The general
* intent is that, for any object {@code x}, the expression:
* 创建并返回此对象的副本。 “复制”的精确含义可能取决于对象的类。 一般的意图是,对于任何对象x ,表达式:
* <blockquote>
* <pre>
* x.clone() != x</pre></blockquote>
* will be true, and that the expression:
* 结果是true,而且表达:
* <blockquote>
* <pre>
* x.clone().getClass() == x.getClass()</pre></blockquote>
* will be {@code true}, but these are not absolute requirements.
* While it is typically the case that:
* 将是true ,但这些都不是绝对的要求。 通常情况是:
* <blockquote>
* <pre>
* x.clone().equals(x)</pre></blockquote>
* will be {@code true}, this is not an absolute requirement.
* 将是true ,这不是一个绝对的要求。
* <p>
* By convention, the returned object should be obtained by calling
* {@code super.clone}. If a class and all of its superclasses (except
* {@code Object}) obey this convention, it will be the case that
* {@code x.clone().getClass() == x.getClass()}.
* 按照惯例,返回的对象应该通过调用super.clone获得。 如果一个类和它的所有超类(除了Object )遵守这个惯例,那将是x.clone().getClass() == x.getClass()的情况。
* <p>
* By convention, the object returned by this method should be independent
* of this object (which is being cloned).
* 按照惯例,此方法返回的对象应该与此对象(正被克隆)无关。
* To achieve this independence, it may be necessary to modify one or more fields of the object returned
* by {@code super.clone} before returning it.
* 为了实现这一独立性,可能需要修改super.clone返回的对象的一个或多个字段。
* Typically, this means
* copying any mutable objects that comprise the internal "deep structure"
* of the object being cloned and replacing the references to these
* objects with references to the copies.
* 通常,这意味着复制构成被克隆的对象的内部“深层结构”的任何可变对象,并通过引用该副本替换对这些对象的引用。
* If a class contains only
* primitive fields or references to immutable objects, then it is usually
* the case that no fields in the object returned by {@code super.clone}
* need to be modified.
* 如果一个类仅包含原始字段或对不可变对象的引用,则通常情况下, super.clone返回的对象中的字段通常不需要修改。
* <p>
* The method {@code clone} for class {@code Object} performs a
* specific cloning operation.
* clone的方法Object执行特定的克隆操作。
* First, if the class of this object does
* not implement the interface {@code Cloneable}, then a
* {@code CloneNotSupportedException} is thrown.
* 首先,如果此对象的类不实现接口Cloneable ,则抛出CloneNotSupportedException 。
* Note that all arrays
* are considered to implement the interface {@code Cloneable} and that
* the return type of the {@code clone} method of an array type {@code T[]}
* is {@code T[]} where T is any reference or primitive type.
* 请注意,所有数组都被认为是实现接口Cloneable ,并且数组类型T[]的clone方法的返回类型是T[] ,其中T是任何引用或原始类型。
*
* Otherwise, this method creates a new instance of the class of this
* object and initializes all its fields with exactly the contents of
* the corresponding fields of this object, as if by assignment; the
* contents of the fields are not themselves cloned.
* 否则,该方法将创建该对象的类的新实例,并将其所有字段初始化为完全符合该对象的相应字段的内容,就像通过赋值一样。
*
* Thus, this method
* performs a "shallow copy" of this object, not a "deep copy" operation.
* 这些字段的内容本身不被克隆。 因此,该方法执行该对象的“浅拷贝”,而不是“深度拷贝”操作。
* <p>
*
* The class {@code Object} does not itself implement the interface
* {@code Cloneable}, so calling the {@code clone} method on an object
* whose class is {@code Object} will result in throwing an
* exception at run time.
* Object类本身并不实现接口Cloneable ,因此在类别为Object的对象上调用clone方法将导致运行时抛出异常。
*
* @return a clone of this instance.
* @throws CloneNotSupportedException if the object's class does not
* support the {@code Cloneable} interface. Subclasses
* that override the {@code clone} method can also
* throw this exception to indicate that an instance cannot
* be cloned.
* 如果对象的类不支持Cloneable接口。 覆盖clone方法的子类也可以抛出此异常以指示实例无法克隆
* @see Cloneable
*/
protected native Object clone() throws CloneNotSupportedException;
/**
* Returns a string representation of the object. In general, the
* {@code toString} method returns a string that
* "textually represents" this object. The result should
* be a concise but informative representation that is easy for a
* person to read.
* It is recommended that all subclasses override this method.
*
* 返回对象的字符串表示形式。 一般来说, toString方法返回一个“textually代表”这个对象的字符串。
* 结果应该是一个简明扼要的表达,容易让人阅读。
* 建议所有子类覆盖此方法。
*
* <p>
* The {@code toString} method for class {@code Object}
* returns a string consisting of the name of the class of which the
* object is an instance, the at-sign character `{@code @}', and
* the unsigned hexadecimal representation of the hash code of the
* object. In other words, this method returns a string equal to the
* value of:
* 该toString类方法Object返回一个由其中的对象是一个实例,该符号字符`的类的名称的字符串@ ”和对象的哈希码的无符号的十六进制表示。
* 换句话说,这个方法返回一个等于下列值的字符串:
* <blockquote>
* <pre>
* getClass().getName() + '@' + Integer.toHexString(hashCode())
* </pre></blockquote>
*
* @return a string representation of the object.
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
/**
* Wakes up a single thread that is waiting on this object's
* monitor.
* 唤醒正在等待对象监视器的单个线程。
* If any threads are waiting on this object, one of them
* is chosen to be awakened.
* 如果任何线程正在等待这个对象,其中一个被选择被唤醒。
* The choice is arbitrary and occurs at the discretion of the implementation.
* 选择是任意的,并且由实施的判断发生。
* A thread waits on an object's monitor by calling one of the {@code wait} methods.
* 线程等待对象的监视器调用wait
* <p>
* The awakened thread will not be able to proceed until the current
* thread relinquishes the lock on this object.
* 唤醒的线程将无法继续,直到当前线程放弃此对象上的锁定为止。
* The awakened thread will compete in the usual manner with any other threads that might be
* actively competing to synchronize on this object;
* 唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极地竞争在该对象上进行同步;
* for example, the awakened thread enjoys no reliable privilege or disadvantage in being
* the next thread to lock this object.
* 例如,唤醒的线程在下一个锁定该对象的线程中没有可靠的权限或缺点。
* <p>
* This method should only be called by a thread that is the owner
* of this object's monitor. A thread becomes the owner of the
* object's monitor in one of three ways:
* 方法只能由作为该对象的监视器的所有者的线程调用。 线程以三种方式之一成为对象监视器的所有者:
* <ul>
* <li>By executing a synchronized instance method of that object.
* 通过执行该对象的同步实例方法。
* <li>By executing the body of a {@code synchronized} statement
* that synchronizes on the object.
* 通过执行在对象上synchronized synchronized语句的正文。
* <li>For objects of type {@code Class,} by executing a
* synchronized static method of that class.
* 对于类型为Class,的对象,通过执行该类的同步静态方法。
* </ul>
* <p>
* Only one thread at a time can own an object's monitor.
* 一次只能有一个线程可以拥有一个对象的显示器。
*
* @throws IllegalMonitorStateException if the current thread is not
* the owner of this object's monitor.
* 如果当前线程不是此对象的监视器的所有者。
* @see Object#notifyAll()
* @see Object#wait()
*/
public final native void notify();
/**
* Wakes up all threads that are waiting on this object's monitor. A
* thread waits on an object's monitor by calling one of the
* {@code wait} methods.
* 唤醒正在等待对象监视器的所有线程。 线程通过调用wait方法之一等待对象的监视器。
* <p>
* The awakened threads will not be able to proceed until the current
* thread relinquishes the lock on this object. The awakened threads
* will compete in the usual manner with any other threads that might
* be actively competing to synchronize on this object; for example,
* the awakened threads enjoy no reliable privilege or disadvantage in
* being the next thread to lock this object.
*
* 唤醒的线程将无法继续,直到当前线程释放该对象上的锁。
* 唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极地竞争在该对象上进行同步;
* 例如,唤醒的线程在下一个锁定该对象的线程中不会有可靠的特权或缺点。
*
* <p>
* This method should only be called by a thread that is the owner
* of this object's monitor. See the {@code notify} method for a
* description of the ways in which a thread can become the owner of
* a monitor.
* 该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方法的说明,请参阅notify方法。
*
* @throws IllegalMonitorStateException if the current thread is not
* the owner of this object's monitor.
* 如果当前线程不是此对象的监视器的所有者。
* @see Object#notify()
* @see Object#wait()
*/
public final native void notifyAll();
/**
* Causes the current thread to wait until either another thread invokes the
* {@link Object#notify()} method or the
* {@link Object#notifyAll()} method for this object, or a
* specified amount of time has elapsed.
* 导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或指定的时间已过。
* <p>
* The current thread must own this object's monitor.
* 当前的线程必须拥有该对象的显示器。
* <p>
* This method causes the current thread (call it <var>T</var>) to
* place itself in the wait set for this object and then to relinquish
* any and all synchronization claims on this object. Thread <var>T</var>
* becomes disabled for thread scheduling purposes and lies dormant
* until one of four things happens:
* 此方法使当前线程(称为T )将其放置在该对象的等待集中,然后放弃对该对象的任何和所有同步声明。
* 线程T变得禁用线程调度目的,并且休眠,直到发生四件事情之一:
* <ul>
* <li>Some other thread invokes the {@code notify} method for this
* object and thread <var>T</var> happens to be arbitrarily chosen as
* the thread to be awakened.
* 一些其他线程调用该对象的notify方法,并且线程T恰好被任意选择为被唤醒的线程。
*
* <li>Some other thread invokes the {@code notifyAll} method for this
* object.
* 某些其他线程调用此对象的notifyAll方法。
*
* <li>Some other thread {@linkplain Thread#interrupt() interrupts}
* thread <var>T</var>.
* 一些其他线程interrupts线程T。
*
* <li>The specified amount of real time has elapsed, more or less. If
* {@code timeout} is zero, however, then real time is not taken into
* consideration and the thread simply waits until notified.
* 指定的实时数量已经过去,或多或少。 然而,如果timeout为零,则不考虑实时,线程等待直到通知。
* </ul>
* The thread <var>T</var> is then removed from the wait set for this
* object and re-enabled for thread scheduling.
* 然后从该对象的等待集中删除线程T ,并重新启用线程调度。
* It then competes in the
* usual manner with other threads for the right to synchronize on the object;
* 然后它以通常的方式与其他线程竞争在对象上进行同步的权限;
*
* once it has gained control of the object, all its
* synchronization claims on the object are restored to the status quo
* ante - that is, to the situation as of the time that the {@code wait}
* method was invoked. Thread <var>T</var> then returns from the
* invocation of the {@code wait} method. Thus, on return from the
* {@code wait} method, the synchronization state of the object and of
* thread {@code T} is exactly as it was when the {@code wait} method
* was invoked.
*
* 一旦获得了对象的控制,其对对象的所有同步声明就恢复到现状 -
* 也就是在调用wait方法之后的情况。 线程T然后从调用wait方法返回。
* 因此,从返回wait方法,对象和线程的同步状态T正是因为它是当wait被调用的方法。
*
* <p>
* A thread can also wake up without being notified, interrupted, or
* timing out, a so-called <i>spurious wakeup</i>. While this will rarely
* occur in practice, applications must guard against it by testing for
* the condition that should have caused the thread to be awakened, and
* continuing to wait if the condition is not satisfied. In other words,
* waits should always occur in loops, like this one:
* 线程也可以唤醒,而不会被通知,中断或超时,即所谓的虚假唤醒 。
* 虽然这在实践中很少会发生,但应用程序必须通过测试应该使线程被唤醒的条件来防范,并且如果条件不满足则继续等待。
* 换句话说,等待应该总是出现在循环中,就像这样:
* <pre>
* synchronized (obj) {
* while (<condition does not hold>)
* obj.wait(timeout);
* ... // Perform action appropriate to condition
* }
* </pre>
* (For more information on this topic, see Section 3.2.3 in Doug Lea's
* "Concurrent Programming in Java (Second Edition)" (Addison-Wesley,
* 2000), or Item 50 in Joshua Bloch's "Effective Java Programming
* Language Guide" (Addison-Wesley, 2001).
* 有关此主题的更多信息,请参阅Doug Lea的“Java并行编程(第二版)”(Addison-Wesley,2000)中
* 的第3.2.3节或Joshua Bloch的“有效Java编程语言指南”(Addison- Wesley,2001
*
* <p>If the current thread is {@linkplain Thread#interrupt()
* interrupted} by any thread before or while it is waiting, then an
* {@code InterruptedException} is thrown. This exception is not
* thrown until the lock status of this object has been restored as
* described above.
* 如果当前线程interrupted任何线程之前或在等待时,那么InterruptedException被抛出。 如上所述,在该对象的锁定状态已恢复之前,不会抛出此异常。
*
* <p>
* Note that the {@code wait} method, as it places the current thread
* into the wait set for this object, unlocks only this object; any
* other objects on which the current thread may be synchronized remain
* locked while the thread waits.
* 请注意, wait方法,因为它将当前线程放入该对象的等待集,仅解锁此对象; 当前线程可以同步的任何其他对象在线程等待时保持锁定。
* <p>
* This method should only be called by a thread that is the owner
* of this object's monitor. See the {@code notify} method for a
* description of the ways in which a thread can become the owner of
* a monitor.
* 该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方法的说明,请参阅notify方法。
*
* @param timeout the maximum time to wait in milliseconds. 以毫秒为单位等待的最长时间。
* @throws IllegalArgumentException if the value of timeout is
* negative. 如果超时值为负。
* @throws IllegalMonitorStateException if the current thread is not
* the owner of the object's monitor. 如果当前线程不是对象监视器的所有者。
* @throws InterruptedException if any thread interrupted the
* current thread before or while the current thread
* was waiting for a notification. The <i>interrupted
* status</i> of the current thread is cleared when
* this exception is thrown.
* 如果任何线程在当前线程等待通知之前或当前线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。
* @see Object#notify()
* @see Object#notifyAll()
*/
public final native void wait(long timeout) throws InterruptedException;
/**
* Causes the current thread to wait until another thread invokes the
* {@link Object#notify()} method or the
* {@link Object#notifyAll()} method for this object, or
* some other thread interrupts the current thread, or a certain
* amount of real time has elapsed.
* 导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或其他一些线程中断当前线程,或一定量的实时时间。
* <p>
* This method is similar to the {@code wait} method of one
* argument, but it allows finer control over the amount of time to
* wait for a notification before giving up. The amount of real time,
* measured in nanoseconds, is given by:
* 这种方法类似于一个参数的wait方法,但它允许对放弃之前等待通知的时间进行更精细的控制。 以纳秒为单位的实时数量由下式给出:
* <blockquote>
* <pre>
* 1000000*timeout+nanos</pre></blockquote>
* <p>
* In all other respects, this method does the same thing as the
* method {@link #wait(long)} of one argument. In particular,
* {@code wait(0, 0)} means the same thing as {@code wait(0)}.
* 在所有其他方面,该方法与一个参数的方法wait(long)相同。 特别是, wait(0, 0)意味着同样的事情wait(0) 。
* <p>
* The current thread must own this object's monitor. The thread
* releases ownership of this monitor and waits until either of the
* following two conditions has occurred:
* 当前的线程必须拥有该对象的显示器。 线程释放此监视器的所有权,并等待直到发生以下两种情况之一:
* <ul>
* <li>Another thread notifies threads waiting on this object's monitor
* to wake up either through a call to the {@code notify} method
* or the {@code notifyAll} method.
* 另一个线程通知等待该对象的监视器的线程通过调用notify方法或notifyAll方法来唤醒。
* <li>The timeout period, specified by {@code timeout}
* milliseconds plus {@code nanos} nanoseconds arguments, has
* elapsed.
* 由timeout毫秒加nanos纳秒参数指定的超时时间已过。
* </ul>
* <p>
* The thread then waits until it can re-obtain ownership of the
* monitor and resumes execution.
* 然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。
* <p>
* As in the one argument version, interrupts and spurious wakeups are
* possible, and this method should always be used in a loop:
* 像在一个参数版本中,中断和虚假唤醒是可能的,并且该方法应该始终在循环中使用:
* <pre>
* synchronized (obj) {
* while (<condition does not hold>)
* obj.wait(timeout, nanos);
* ... // Perform action appropriate to condition
* }
* </pre>
* This method should only be called by a thread that is the owner
* of this object's monitor. See the {@code notify} method for a
* description of the ways in which a thread can become the owner of
* a monitor.
* 该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方式的说明,请参阅notify方法。
*
* @param timeout the maximum time to wait in milliseconds.
* 以毫秒为单位等待的最长时间。
* @param nanos additional time, in nanoseconds range
* 0-999999.
* 额外的时间,以纳秒范围0-999999。
* @throws IllegalArgumentException if the value of timeout is
* negative or the value of nanos is
* not in the range 0-999999.
* @throws IllegalMonitorStateException if the current thread is not
* the owner of this object's monitor.
* @throws InterruptedException if any thread interrupted the
* current thread before or while the current thread
* was waiting for a notification. The <i>interrupted
* status</i> of the current thread is cleared when
* this exception is thrown.
*/
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
/**
* Causes the current thread to wait until another thread invokes the
* {@link Object#notify()} method or the
* {@link Object#notifyAll()} method for this object.
* In other words, this method behaves exactly as if it simply
* performs the call {@code wait(0)}.
* 导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。
* 换句话说,这个方法的行为就好像简单地执行呼叫wait(0) 。
* <p>
* The current thread must own this object's monitor. The thread
* releases ownership of this monitor and waits until another thread
* notifies threads waiting on this object's monitor to wake up
* either through a call to the {@code notify} method or the
* {@code notifyAll} method. The thread then waits until it can
* re-obtain ownership of the monitor and resumes execution.
* 当前的线程必须拥有该对象的显示器。 该线程释放此监视器的所有权,并等待另一个线程通知等待该对象监视器的线程通过调用notify方法或notifyAll方法notifyAll 。
* 然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。
* <p>
* As in the one argument version, interrupts and spurious wakeups are
* possible, and this method should always be used in a loop:
* 像在一个参数版本中,中断和虚假唤醒是可能的,并且该方法应该始终在循环中使用:
* <pre>
* synchronized (obj) {
* while (<condition does not hold>)
* obj.wait();
* ... // Perform action appropriate to condition
* }
* </pre>
* This method should only be called by a thread that is the owner
* of this object's monitor. See the {@code notify} method for a
* description of the ways in which a thread can become the owner of
* a monitor.
* 该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方式的说明,请参阅notify方法。
*
* @throws IllegalMonitorStateException if the current thread is not
* the owner of the object's monitor.
* @throws InterruptedException if any thread interrupted the
* current thread before or while the current thread
* was waiting for a notification. The <i>interrupted
* status</i> of the current thread is cleared when
* this exception is thrown.
* @see Object#notify()
* @see Object#notifyAll()
*/
public final void wait() throws InterruptedException {
wait(0);
}
/**
* Called by the garbage collector on an object when garbage collection
* determines that there are no more references to the object.
* A subclass overrides the {@code finalize} method to dispose of
* system resources or to perform other cleanup.
* 当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。
* 一个子类覆盖了处理系统资源或执行其他清理的finalize方法。
* <p>
* The general contract of {@code finalize} is that it is invoked
* if and when the Java™ virtual
* machine has determined that there is no longer any
* means by which this object can be accessed by any thread that has
* not yet died,
* finalize的一般合同是,如果Java¢虚拟机已经确定不再有任何方法可以被任何尚未死亡的线程访问的方法被调用,
* except as a result of an action taken by the
* finalization of some other object or class which is ready to be
* finalized.
* 除非是由于最后确定的其他对象或类的准备工作所采取的行动。
* The {@code finalize} method may take any action, including
* making this object available again to other threads; the usual purpose
* of {@code finalize}, however, is to perform cleanup actions before
* the object is irrevocably discarded.
* finalize方法可以采取任何行动,包括使此对象再次可用于其他线程; 然而, finalize的通常目的是在对象不可撤销地丢弃之前执行清除动作。
* For example, the finalize method
* for an object that represents an input/output connection might perform
* explicit I/O transactions to break the connection before the object is
* permanently discarded.
* 例如,表示输入/输出连接的对象的finalize方法可能会在对象被永久丢弃之前执行显式I / O事务来中断连接。
* <p>
* The {@code finalize} method of class {@code Object} performs no
* special action; it simply returns normally. Subclasses of
* {@code Object} may override this definition.
* 所述finalize类的方法Object执行任何特殊操作; 它只是返回正常。 Object的Object可以覆盖此定义。
* <p>
* The Java programming language does not guarantee which thread will
* invoke the {@code finalize} method for any given object. It is
* guaranteed, however, that the thread that invokes finalize will not
* be holding any user-visible synchronization locks when finalize is
* invoked. If an uncaught exception is thrown by the finalize method,
* the exception is ignored and finalization of that object terminates.
* Java编程语言不能保证哪个线程将为任何给定的对象调用finalize方法。 但是,确保调用finalize的线程在调用finalize时不会持有任何用户可见的同步锁。
* 如果finalize方法抛出未捕获的异常,则会忽略该异常,并终止该对象的定类。
* <p>
* After the {@code finalize} method has been invoked for an object, no
* further action is taken until the Java virtual machine has again
* determined that there is no longer any means by which this object can
* be accessed by any thread that has not yet died, including possible
* actions by other objects or classes which are ready to be finalized,
* at which point the object may be discarded.
* 在为对象调用finalize方法之后,在Java虚拟机再次确定不再有任何方式可以通过任何尚未被死亡的线程访问此对象的任何方法的情况下,
* 将采取进一步的操作,包括可能的操作由准备完成的其他对象或类别,此时可以丢弃对象。
* <p>
* The {@code finalize} method is never invoked more than once by a Java
* virtual machine for any given object.
* finalize方法从不被任何给定对象的Java虚拟机调用多次。
* <p>
* Any exception thrown by the {@code finalize} method causes
* the finalization of this object to be halted, but is otherwise
* ignored.
* finalize方法抛出的任何异常都会导致该对象的终止被停止,否则被忽略。
*
* @throws Throwable the {@code Exception} raised by this method
* @see java.lang.ref.WeakReference
* @see java.lang.ref.PhantomReference
* @jls 12.6 Finalization of Class Instances
*/
protected void finalize() throws Throwable { }
}