Java多线程

wait()方法

方法wait()的作用是使当前执行代码的线程进行等待,wait() 方法是 Object 类的方法,该方法用来将当前线程置入 “预执行队列” 中,并且在 wait() 所在的代码行处停止执行,直到接到通知或被中断为止。

注意:

  在调用 wait() 之前,线程必须获得该对象的对象级别锁,否则会抛出 illegalMonitorStateException 异常。在执行 wait() 方法后,当前线程释放锁。

notify()方法

方法notify() 也要在同步方法或同步块中调用,即在调用前,线程必须获得该对象的对象级别锁,否则会抛出 illegalMonitorStateException 异常。

该方法用来通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规划器随机挑选出齐总一个呈 wait 状态的线程,对其发出通知 notify。

注意:

  1)执行 notify() 之后,当前线程不会马上释放该对象锁,呈 wait 状态的线程也并不能马上获取该对象锁,要等到执行 notify() 方法的线程将程序执行完,也就是退出 synchronized 代码块之后,当前线程才会释放锁,而呈 wait 状态的所在的线程才可以获取该对象锁。

  2)当一个获得了对象锁的 wait 线程运行完毕,它会释放该对象锁,此时如果该对象没有再次使用 notify 语句,即便该对象已经闲置,其他 wait 状态等待的线程由于没有接到通知,还会继续阻塞在 wait 状态

示例

1public class Test { 2 public static void main(String[] args) { 3 try { 4 Object lock = new Object(); 5 MyThread1 t1 = new MyThread1(lock); 6 t1.start(); 7 Thread.sleep(2000); 8 MyThread2 t2 = new MyThread2(lock); 9 t2.start(); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } 13 } 14 15 static class MyThread1 extends Thread { 16 private Object lock; 17 18 public MyThread1(Object lock) { 19 this.lock = lock; 20 } 21 22 @Override 23 public void run() { 24 try { 25 synchronized (lock) { 26 System.out.println("开始 wait"); 27 lock.wait(); 28 System.out.println("结束 wait"); 29 } 30 } catch (InterruptedException e) { 31 e.printStackTrace(); 32 } 33 } 34 } 35 36 static class MyThread2 extends Thread { 37 private Object lock; 38 39 public MyThread2(Object lock) { 40 this.lock = lock; 41 } 42 43 @Override 44 public void run() { 45 synchronized (lock) { 46 System.out.println("开始 notify"); 47 lock.notify(); 48 System.out.println("结束 notify"); 49 } 50 } 51 } 52}

运行结果:

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java wait方法

wait方法是让当前线程等待,这里的当前线程不是指t,而是主线程。wait会释放锁,等到其他线程调用notify方法时再继续运行。可以看下面的例子。!复制代码(https://oscimg.oschina.net/oscnet/224d9647687662c8b42e4eba0095746fe95.gif)1packagecom

android 面试题总结

Java部分一、多线程 Join() 线程加入,执行此方法的线程优先使用cpu Yeild() 线程释放资源使所有线程能有相等的机会使用cpu Sleep()相当于让线程睡眠,交出CPU,让CPU去执行其他的任务(不会释放锁)。Wait()方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。

探索JAVA并发

\sleep/wait/notify/notifyAll分别有什么作用?它们的区别是什么?wait时为什么要放在循环里而不能直接用if?简介首先对几个相关的方法做个简单解释,Object中有几个用于线程同步的方法:wait、notify、notifyAll。publicclassObject{public