Java多线程的两种休眠
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、sleep()方法
自我休眠,自我唤醒(休眠时间到后自我苏醒)。
每一个对象都有一把锁,sleep不会释放锁。
public class Thread01 extends Thread{
@Override
public void run() {
System.out.println("当前执行的线程是"+Thread.currentThread().getName());
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);// 模拟网络延时,放大问题的发生性
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i);
}
}
public static void main(String[] args) {
Thread01 t1 = new Thread01();
t1.start();
}
}
二、wait()方法
不会主动苏醒,需要另外的线程调用notify()/notifyAll()方法唤醒。
wait()方法会释放锁。
public class Test{
public static void main(String[] args){
Service mService = new Service();
Thread sleepThread = new Thread(new SleepThread(mService));
Thread waitThread = new Thread(new WaitThread(mService));
waitThread.start();
sleepThread.start();
}
}
class Service {
public void mSleep(){
synchronized(this){
try{
Thread.sleep(1000);
this.notify();//或 this.notifyAll()
System.out.println(" 唤醒等待:结束时间:"+System.currentTimeMillis());
}catch(Exception e){
System.out.println(e);
}
}
}
public void mWait(){
synchronized(this){
try{
System.out.println(" 等待开始:当前时间:"+System.currentTimeMillis());
this.wait();
}catch(Exception e){
System.out.println(e);
}
}
}
}
三、线程状态图
sleep()方法和wait()方法
相同点:一旦执行方法以后,都会使得当前的进程进入阻塞状态。
不同点:
1.方法声明方式不同,sleep()方法在Thread类中声明,wait()方法在Object类中声明。
2.调用的条件不同,sleep可以在任何需要的场景下调用,wait必须使用在同步代码块或者同步方法中。
3.是否释放锁,sleep不会释放,wait会释放。
sleep()方法和wait()方法的状态图:如下