咖啡网站开发背景怎么写,青岛航拍公司,怎样自己免费搭建网站,平台推广策划文案#x1f490;专栏导读 本篇文章收录于多线程#xff0c;也欢迎翻阅博主的其他文章#xff0c;可能也会让你有不一样的收获#x1f604; #x1f342;JavaSE #x1f337;多线程 #x1f33c;数据结构 文章目录 #x1f490;专栏导读#x1f490;wait()#x1f490;no…专栏导读 本篇文章收录于多线程也欢迎翻阅博主的其他文章可能也会让你有不一样的收获 JavaSE 多线程 数据结构 文章目录 专栏导读wait()notify()notifyAll()wait和sleep()的区别 首先我们知道线程的执行顺序是随机的(操作系统随机调度的抢占式执行)但是有时候我们并不喜欢这种随机的执行更喜欢的是它们能够顺序的执行所以Java就引入了一种机制wait 和 notify 它们的
作用就是保证线程执行的顺序 而前面的文章中也讲过一个方法 join()也是能影响线程的执行顺序但是呢这个join只能控制线程结束的顺序而我们想要的是线程不结束也能按照我们自己规定的顺序去依次执行
wait()
使用wait时要注意一定要搭配synchronized使用否则的话就会抛出异常 调用wait时wait会做三件事
1、使当前代码的线程处于阻塞等待
2、释放当前锁
3、在其他线程中使用锁对象调用notify时或者使用带参数的wait(带有时间参数超过时间就会被唤醒)被被唤醒后然后重新尝试获取锁 可以看到当执行到wait这行代码时就一直处于了阻塞等待因为需要在其他线程中使用notify来唤醒而目前代码中没有其他线程所以就一直等待这里也需要解释一下关于调用wait() 方法因为wait方法是Object类中的方法所以所有的对象都可以调用;
notify()
notify 是唤醒其他使用wait进行等待的线程
1.调用notify的代码块要与调用wait的代码块都要在锁中使用并且是一个锁对象
2.使用notify进行唤醒某个线程时调用 notify() 的对象要和调用 wait() 的对象是一个 如果有多个线程在等待那么唤醒后操作系统的调度器会随机调度不会区分先后顺序 public static void main(String[] args) throws InterruptedException {Object locker new Object();Thread thread1 new Thread(() - {synchronized (locker) {System.out.println(thread1执行调用wait进行阻塞,同时释放锁);try {locker.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(thread1执行完);}});Thread thread2 new Thread(() - {//先进行一个睡眠可以明显的观察效果try {Thread.sleep(100);//让thread1先执行进入阻塞System.out.println(thread2执行进入睡眠四秒);Thread.sleep(4000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (locker) {System.out.println(四秒后);System.out.println(进行唤醒);locker.notify();}});thread1.start();thread2.start();}wait() 、notify() 也可以避免“线程饿死”
举个例子 notifyAll()
如果多个线程都调用wait的话多个线程都会进入阻塞那么用notify的话就只能唤醒一个但是用notifyAll的话就可以一次性全部唤醒这里要注意一点多个线程被同时唤醒时就会同时获取锁这时候就会产生锁冲突然后只有一个线程能够成功的得到锁
wait和sleep()的区别
类不同sleep() 是Thread线程类的静态方法 wait() 是 Object类的方法调用后是否释放锁 sleep() 调用后不会有释放锁的操作 wait() 调用后会释放锁用途不同 wait 通常用于线程间交互/通信 sleep通常用于暂停执行用法不同wait() 方法被调用后线程不会自动苏醒需要别的线程调用同一个对象上的notify() 方法 或者 notifyAll() 方法 或者是使用wait(long timeout),指定一个阻塞时间超时后线程自动苏醒。sleep() 方法执行完后线程会自动苏醒。