Object类API
Object相关的方法一定是当前线程在获取了对应的锁对象才能调用,否则会抛出异常
o.wait(): 锁对象调用该方法使当前线程进入
WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后,会释放锁对象。因此,wait 方法一般用在同步方法或同步代码块中。
o.wait(long): 锁对象调用该方法使当前线程进入
WAITING 状态,同时释放锁对象。但是超过等待的时间后线程会自动唤醒,或者被其他线程唤醒,并进入等锁池中。
o.wait(long,int): 和o.wait(long)方法一样,如果int参数大于0则前面的long数字加1
//This method should only be called by a thread that is the owner of this object's monitor
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
o.notify():随机唤醒一个处于等待中的线程(同一个等待阻塞池中)
o.notifyAll():唤醒所有等待中的线程(同一个等待阻塞池中)
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:
1、By executing a synchronized instance method of that object.
2、By executing the body of a synchronized statement that synchronizes on the object.
3、For objects of type Class, by executing a synchronized static method of that class.Only one thread at a time can own an object's monitor.
Thread类API
- 线程睡眠
sleep():sleep导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED_WATING 状态,而 wait()方法会导致当前线程进入 WATING 状态。
- 线程让步
yield():yield 会使当前线程让出 CPU 执行时间片,与其他线程一起重新竞争 CPU 时间片。一般情况下, 优先级高的线程有更大的可能性成功竞争得到 CPU 时间片,但这又不是绝对的,有的操作系统对线程优先级并不敏感。
- 线程中断
中断一个线程,其本意是给这个线程一个通知信号,会影响这个线程内部的一个中断标识位。这 个线程本身并不会因此而改变状态(如阻塞,终止等)。
1. 调用 interrupt()方法并不会中断一个正在运行的线程。也就是说处于 RUNNING 状态的线程并不会因为被中断而被终止,仅仅改变了内部维护的中断标识位而已。
2. 若调用 sleep()而使线程处于 TIMED_WATING 状态,这时调用 interrupt()方法,会抛出 InterruptedException,从而使线程提前结束 TIMED_WATING 状态。
3. 许多声明抛出 InterruptedException 的方法(如 Thread.sleep(long mills 方法)),抛出异 常前,都会清除中断标识位,所以抛出异常后,调用 isInterrupted()方法将会返回 false。
4. 中断状态是线程固有的一个标识位,可以通过此标识位安全的终止线程。比如,你想终止 一个线程 thread 的时候,可以调用 thread.interrupt()方法,在线程的 run 方法内部可以 根据 thread.isInterrupted()的值来优雅的终止线程。
If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
- 等待其他线程终止
join():等待其他线程终止,在当前线程中调用一个线程的 join() 方法,则当前线程转为阻塞状态,等到另一个线程结束,当前线程再由阻塞状态变为就绪状态,等待 cpu 的执行。