张家港网站建设优化,oa系统怎么用,清镇市最新消息,坑梓网站建设基本流程一、wait()、notify()、notifyAll()等方法介绍
在Object.java中#xff0c;定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态#xff0c;同时#xff0c;wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用#xff0…一、wait()、notify()、notifyAll()等方法介绍
在Object.java中定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态同时wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用则是唤醒当前对象上的等待线程notify()是唤醒单个线程而notifyAll()是唤醒所有的线程。
Object类中关于等待/唤醒的API详细信息如下 notify() – 唤醒在此对象监视器上等待的单个线程。 notifyAll() – 唤醒在此对象监视器上等待的所有线程。 wait() – 让当前线程处于“等待(阻塞)状态”“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”当前线程被唤醒(进入“就绪状态”)。 wait(long timeout) – 让当前线程处于“等待(阻塞)状态”“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法或者超过指定的时间量”当前线程被唤醒(进入“就绪状态”)。 wait(long timeout, int nanos) – 让当前线程处于“等待(阻塞)状态”“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法或者其他某个线程中断当前线程或者已超过某个实际时间量”当前线程被唤醒(进入“就绪状态”)。
二、wait()和notify()示例 package com.demo.Thread;public class ThreadA extends Thread{public ThreadA(String name){super(name);}public void run(){synchronized(this){System.out.println(Thread.currentThread().getName() call notify());// 唤醒当前的wait线程notify();}}
}package com.demo.Thread;
public class WaitTest {public static void main(String[] args){ThreadA t1 new ThreadA(t1);synchronized(t1){try{// 启动“线程t1”System.out.println(Thread.currentThread().getName() start t1);t1.start();// 主线程等待t1通过notify()唤醒。System.out.println(Thread.currentThread().getName() wait());t1.wait();System.out.println(Thread.currentThread().getName() continue);}catch(InterruptedException e){e.printStackTrace();}}}
}运行结果
main start t1
main wait()
t1 call notify()
main continue结果说明
如下图说明了“主线程”和“线程t1”的流程。
(01) 注意图中主线程 代表“主线程main”。“线程t1” 代表WaitTest中启动的“线程t1”。 而“锁” 代表“t1这个对象的同步锁”。 (02) “主线程”通过 new ThreadA(“t1”) 新建“线程t1”。随后通过synchronized(t1)获取“t1对象的同步锁”。然后调用t1.start()启动“线程t1”。 (03) “主线程”执行t1.wait() 释放“t1对象的锁”并且进入“等待(阻塞)状态”。等待t1对象上的线程通过notify() 或 notifyAll()将其唤醒。 (04) “线程t1”运行之后通过synchronized(this)获取“当前对象的锁”接着调用notify()唤醒“当前对象上的等待线程”也就是唤醒“主线程”。 (05) “线程t1”运行完毕之后释放“当前对象的锁”。紧接着“主线程”获取“t1对象的锁”然后接着运行。 对于上面的代码曾经有个朋友问到过t1.wait()应该是让“线程t1”等待但是为什么却是让“主线程main”等待了呢
注意jdk的解释中说wait()的作用是让“当前线程”等待而“当前线程”是指正在cpu上运行的线程 这也意味着虽然t1.wait()是通过“线程t1”调用的wait()方法但是调用t1.wait()的地方是在“主线程main”中。而主线程必须是“当前线程”也就是运行状态才可以执行t1.wait()。所以此时的“当前线程”是“主线程main”因此t1.wait()是让“主线程”等待而不是“线程t1”