目录
sleep()方法:
功能:
使用场合:
注意:
wait()方法
功能:
使用场合:
注意:
代码示例
sleep()方法:
功能:
sleep()方法是Thread类的方法,线程通过调用该方法,进入休眠状态主动让出CPU,从而CPU可以执行其他的线程。经过sleep指定的时间后,CPU回到这个线程上继续往下执行。
如何当前线程进入了同步锁,sleep()方法并不会释放锁。即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。
使用场合:
线程的调度执行是按照其优先级的高低顺序进行的,当高级别的线程未死亡时,低级别的线程没有机会获得CPU资源。有时优先级高的线程需要优先级低的线程完成一些辅助工作或者优先级高的线程需要完成一些比较费时的工作,此时优先级高的线程应该让出CPU资源,使得优先级低的线程有机会执行。为了达到这个目的,优先级高的线程可以在自己的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。
注意:
如果线程在休眠时被打断,JVM就会抛出InterruptedException异常。因此,必须在try-catch语句块中调用sleep方法。
wait()方法
功能:
wait()方法可以中断线程的运行,使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。其他线程如果在使用这个同步方法时不需要等待,那么它使用完这个方法的同时,应该用notifyAll()方法通知所有由于使用了这个同步方法而处于等待的线程结束等待,曾中断的线程就会从刚才中断处继续执行这个同步方法(并不是立马执行,而是结束等待),并遵循“先中断先继续”的原则。
wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果)
使用场合:
当一个线程使用的同步方法中用到某个变量,而此变量又需要起亚线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。
注意:
wait()、notify()和notifyAll()都是Object类的final方法,被所有的类继承且不允许重写的方法。特别需要注意的是,不可以在非同步方法中使用上述三个方法。(从功能和使用场合也可以看出)
代码示例
package thread;
public class MultiThread {
public static void main(String[] args) throws InterruptedException {
new Thread(new Thread1()).start();
Thread.sleep(5000);//主动让出CPU,让CPU去执行其他的线程。在sleep指定的时间后,CPU回到这个线程上继续往下执行
new Thread(new Thread2()).start();
}
}
class Thread1 implements Runnable{
@Override
public void run() {
synchronized (MultiThread.class){
System.out.println("进入线程1");
try{
System.out.println("线程1正在等待");
Thread.sleep(5000);
// MultiThread.class.wait();//wait是指一个已经进入同步锁的线程内(此处指Thread1),让自己暂时让出同步锁,
//以便其他在等待此锁的线程(此处指Thread2)可以得到同步锁并运行。
}catch(Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("线程1结束等待,继续执行");
System.out.println("线程1执行结束");
}
}
}
class Thread2 implements Runnable{
@Override
public void run() {
synchronized (MultiThread.class){
System.out.println("进入线程2");
System.out.println("线程2唤醒其他线程");
MultiThread.class.notify();//Thread2调用了notify()方法,但该方法不会释放对象锁,只是告诉调用wait方法的线程可以去
//参与获得锁的竞争了。但不会马上得到锁,因为锁还在别人手里,别人还没有释放。如果notify()
//后面的代码还有很多,需要执行完这些代码才会释放锁。
try {
Thread.sleep(5000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程2继续执行");
System.out.println("线程2执行结束");
}
}
}