1.Object类线程
wait(空参的)线程进入waiting状态(有参的)线程进入timed_waiting状态对象
notify接口
notifyAll资源
(1)notifyget
public final native void notify();同步
调用一个Object对象的notify()方法,就会唤醒一个正在等待该线程的锁的线程it
(当前可能会有好几个线程调用了该Object对象的重载的wait方法,等待唤醒,该方法只能唤醒一个,随机的)io
唤醒的线程不会当即执行,它会与其余线程一块儿,争夺资源yield
notify方法只能被持有该Object对象锁的线程调用定时器
如何得到对象的锁?
(1)执行该对象的同步实例方法
(2)执行该类的同步静态方法
(3)执行该对象的同步代码块
同一时刻,只有一个线程拥有一个对象的锁
若是当前线程没有持有该对象的锁,抛出异常:IllegalMonitorStateException
(2)notifyAll
public final native void notifyAll();
调用一个Object对象的notifyAll方法,会唤醒全部等待当前对象的锁的线程
调用该方法的线程必须持有当前对象的锁
唤醒全部等待该对象的锁以后,一块儿争夺锁
(3)空参wait() 至关于 wait(0)
调用一个Object对象的空参的wait()方法,会致使当前线程进入等待(waiting)状态,直到另外一个线程调用该Object对象的notify()或者notifyAll()方法
调用wait方法时,当前线程必须持有该Object对象的锁
调用该方法以后,调用该方法的线程进入该Object对象的等待池,并放弃该对象上的全部锁
InterruptedException
IllegalMonitorStateException
public final void wait() throws InterruptedException {
wait(0);
}
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException{……}
(4)一个参数的wait(?)
调用一个Object对象的wait(?)方法,会致使当前线程进入超时等待(timed_waiting)状态
*调用notify
*调用notifyAll()
*调用interrupt
*等待时间到
2.Thread类
run
start
sleep(没有空参的,只有有参的)线程进入timed_waiting状态
interrupt
yeild
join(空参的)线程进入waiting状态(有参的)线程进入timed_waiting状态
(1)start
使当前线程开始执行
调用start方法以后,JVM会调用当前线程的run方法
(2)run
若是当前线程实现了Runnable接口,则接口实现类的run方法被调用
若是直接调用run方法,不能启动一个线程,至关于调用了一个普通方法
(3)sleep
没有空参的方法
使线程进入TIMED_WAITING状态
public static native void sleep(long millis) throws InterruptedException;
public static void sleep(long millis, int nanos)throws InterruptedException {……}
使当前正在执行的线程休眠(暂停执行)指定的毫秒数
受到系统定时器和调度器精度和准确度的影响
当前线程休眠指定的毫秒数,在休眠期间不会释放它已经持有的任何锁
InterruptedException(当前正在休眠的线程被其它线程打断)
IllegalArgumentException(参数无效)
(4)join
public final void join() throws InterruptedException {
join(0);
}
public final synchronized void join(long millis) throws InterruptedException
public final synchronized void join(long millis, int nanos) throws InterruptedException
在当前线程内调用其它线程的join方法,当前线程进入Waiting或者TIMED_WAITING状态
释放已经持有的对象锁
等待时间到或者其它线程执行完毕,当前线程进入就绪状态
(5)yield
让步,从而让其余具备相同优先级的线程获取执行权,可是,并不能保证当前线程调用yield以后,其它具备相同优先级的线程就必定能得到执行权
提示调度器当前线程愿意让出当前正在使用的处理器
调度器能够忽略该提示
线程从执行状态变成就绪状态
public static native void yield();
不会释放锁
(6)interrupt
将线程的中断状态设为true
并不会马上终止线程
判断是否中断:
判断当前线程是否中断,并清除中断标志
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
判断方法调用线程是否中断,不清楚中断标志
public boolean isInterrupted() {
return isInterrupted(false);
}
Object wait VS Thread sleep
(1)sleep没有空参的重载形式
(2)wait释放锁 sleep持有锁
(3)空参的sleep,使线程进入waiting状态
(4)有参的wait和sleep,都会使线程进入TIMED_WAITING状态
(5)都有InterruptedException
Object wait VS Thread yield
(1)wait释放锁
(2)yield不释放锁
(3)wait释放锁,使当前线程进入等待状态
(4)yield不释放锁,使当前线程进入就绪状态
(5)wait会使全部等待该对象锁的线程都争夺资源
(6)yield只会使同一优先级的就绪的线程争夺资源
Tread.currentThread(0.getName();
isLive()