1:wait(), notify(), notifyAll();
wait()、notify()、notifyAll()是三个定义在Object类里的方法,不属于Thread类, 可以用来控制线程的状态。而且都是在synchronized内部使用的
wait():
等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。
notify():
唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。
notifyAll():
唤醒所有等待的线程,注意唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的。
public class Service {
public void Method1(Object lock) {
try {
synchronized (lock) {
System.out.println("begin wait() ThreadName="
+ Thread.currentThread().getName());
lock.wait();
System.out.println(" end wait() ThreadName="
+ Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void NotifyMethod1(Object lock) {
try {
synchronized (lock) {
System.out.println("begin notify() ThreadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
lock.notify();//lock.notifyAll();
Thread.sleep(1000);
System.out.println(" end notify() ThreadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Sleep():
使当前线程暂停执行一段时间, 让其他线程有机会继续执行,但是并不释放对象锁
class t1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Item "+i);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
join()
方法使调用该方法的线程在此之前执行完毕,也就是等待该线程的方法执行完毕以后再往下继续执行,
public static void main(String[] args) {
Thread t = new Thread(()->{
System.out.println("Begin");
Thread.sleep(500);
System.out.println("end");});
t.start();
try {
t.join(1000);
System.out.println("Finish");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
yield()
作用让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,
并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程
又进入到“运行状态”继续运行!
3:最后画了一个总结的状态图,