搜索
写经验 领红包
 > 电器

java线程之间如何进行通信(java线程之间如何共享数据)

导语:java线程之 wait、notify/notifyAll 详解

wait notify 原理

API 介绍

1、obj.wait() 让进入 object 监视器的线程到 waitSet 等待;

2、obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒;

3、obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒;

注意:线程调用wait或者notify的时候,必须要先获取到该对象的锁,也就是wait和notify必须写在synchronized里面,不然会出现 IllegalMonitorStateException(非法的监控状态) 异常;如下图:

我们可以这么理解,monitor是一个房子,waitSet和EntryList是两个休息室,我们要进入这两个休息室,那么一定要先进入这个房子,只有房子的主人才可以进入这个房子。只有获得房子锁的人才可以进入。

wait notify 的区别

1) sleep 是 Thread 方法,而 wait 是 Object 的方法

2) sleep 不需要强制和 synchronized 配合使用,但 wait 需要 和 synchronized 一起用

3) sleep 在睡眠的同时,不会释放对象锁的,但 wait 在等待的时候会释放对象锁

4) 它们 状态 TIMED_WAITING

以下代码演示sleep不会释放锁;

以上代码:t1线程先获取到锁,应为main线程睡眠了1秒后再获取锁,t1线程获取到锁后就进入睡眠10秒钟,这个时候main线程已经获取不到锁了,必须等待10秒钟后才可以获取锁,所以sleep是不会释放对的锁。

本文内容由小美整理编辑!