java多线程之wait和notify
多线程中的通信是非常重要的概念,线程直接实现通信就可以并发完成很多复杂工作。
java在Object类中就设计了wait()和notify()两个方法,以解决这个问题。
1.释义:
wait()方法将当前线程暂停,置于“预执行队列”中,而notify()则用于通知一个在wait等待中的线程,可以继续执行了
2.wait()和notify()的使用条件:
wait()和notify()必须置于同步方法和同步代码块中使用,即在调用前,线程必须获得该对象的对象级别锁。否则会抛出异常
3.线程执行到wait()时,直接释放锁,处于等待状态;
public class WaitService {
public void testMethod(Object lock) {
try {
synchronized (lock) {
System.out.println("wait begin");
lock.wait();
System.out.println("wait end");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class WaitThread1 extends Thread {
private Object lock;
public WaitThread1(Object lock) {
this.lock = lock;
}
@Override
public void run() {
WaitService service = new WaitService();
service.testMethod(lock);
}
}
public class WaitThread2 extends Thread {
private Object lock;
public WaitThread2(Object lock) {
this.lock = lock;
}
@Override
public void run() {
WaitService service = new WaitService();
service.testMethod(lock);
}
}
public class WaitTest {
public static void main(String[] args) {
Object lock=new Object();
WaitThread1 t1=new WaitThread1(lock);
WaitThread2 t2 = new WaitThread2(lock);
t1.start();
t2.start();
}
}
执行结果:
wait begin
wait begin
4.线程执行notify时,当前线程并不马上释放锁,wait状态的线程也不会马上获得锁,要执行notify方法的程序执行完,退出syncronized代码块后,才释放锁。
public class NotifyService {
public void testMethod(Object lock){
try {
synchronized (lock){
System.out.println("wait begin");
lock.wait();
System.out.println("wait end");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void notifyMethod(Object lock){
try {
synchronized (lock) {
System.out.println("begin nofity ");
Thread.sleep(1000);
lock.notify();
System.out.println("end nofity ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class NotifyThreadA extends Thread{
private Object lock;
public NotifyThreadA(Object lock) {
this.lock = lock;
}
@Override
public void run() {
NotifyService service=new NotifyService();
service.testMethod(lock);
}
}
public class NotifyThreadB extends Thread {
private Object lock;
public NotifyThreadB(Object lock) {
this.lock = lock;
}
@Override
public void run() {
NotifyService service=new NotifyService();
service.notifyMethod(lock);
}
}
public class NotifyTest {
public static void main(String[] args) {
Object lock=new Object();
NotifyThreadA a = new NotifyThreadA(lock);
a.start();
NotifyThreadB b = new NotifyThreadB(lock);
b.start();
}
}
输出:
wait begin
begin nofity
end nofity
wait end
java多线程之wait和notify的更多相关文章
- java多线程之wait和notify协作,生产者和消费者
这篇直接贴代码了 package cn.javaBase.study_thread1; class Source { public static int num = 0; //假设这是馒头的数量 } ...
- Java多线程之Wait()和Notify()
1.Wait()和Notify.NotifyAll都是Object的方法 2.多线程的协作是通过控制同一个对象的Wait()和Notify()完成 3.当调用Wait()方法时,当前线程进入阻塞状态, ...
- Java多线程之wait、notify/notifyAll 详解,用wait 和notifyAll 以及synchronized实现阻塞队列,多线程拓展之ReentrantLock与Condition
前言:这几天看了很多关于多线程的知识,分享一波.(但是目前接触的项目还未用到过,最多用过线程池,想看线程池 请看我之前的博客) 关于基本的理论等 参考如下: https://www.cnblogs.c ...
- java 多线程之synchronized wait/notify解决买票问题
一.Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的st ...
- 1.Java多线程之wait和notify
1.首先我们来从概念上理解一下这两个方法: (1)obj.wait(),当obj对象调用wait方法时,这个方法会让当前执行了这条语句的线程处于等待状态(或者说阻塞状态),并释放调用wait方法的对象 ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...
- java多线程之yield,join,wait,sleep的区别
Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...
- Java多线程之ConcurrentSkipListMap深入分析(转)
Java多线程之ConcurrentSkipListMap深入分析 一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...
随机推荐
- jQuery分离构造器
http://www.imooc.com/code/3401 通过new操作符构建一个对象,一般经过四步: A.创建一个新对象 B.将构造函数的作用域赋给新对象(所以this就指向了这个新对象) ...
- VBS学习日记(二) 基础知识
VBScript 基础知识 一.变量 1.全部单引號后面的内容都被解释为凝视.(在vbsedit中ctrl+m凝视,反凝视ctrl+shift+m) 2.在 VBScript 中,变量的命名规则遵循标 ...
- 深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView)
原文:深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView) 很久没有更新博客了,今天无事把GMAP.NET的代码又重新翻了翻,看到了街景地图的例子. 街景地图是谷歌最早提 ...
- .NET内置的Ajax工作原理
在期望不执行回发(postback)而从客户端运行服务器代码的情况下,可以使用ClientScriptManager类来调用客户端回调(callback).这称为对服务器执行带外回调.在客户端回调中, ...
- NS2网络模拟(4)-吞吐率图
1: #NS2_有线部分\ForGnuplot.plot 2: 3: #gnuplot> 4: #set xtics 0, 1, 10 5: set grid 6: set xrange [0: ...
- python 教程 第二章、 类型
第二章. 类型 常量 5,1.23,9.25e-3,’This is a string’,”It’s a string!” 1) 数 整数:2 长整数: 浮点数:3.23,52.3E-4 复数:-5+ ...
- matlab figure 调整大小、字体、线宽
用 matlab 画了一张图,投稿时要缩小,缩小后字体就会过小或者发虚. 解决办法: % figure resize set(gcf,'Position',[100 100 260 220]); se ...
- [AC自己主动机+可能性dp] hdu 3689 Infinite monkey theorem
意甲冠军: 给n快报,和m频率. 然后进入n字母出现的概率 然后给目标字符串str 然后问m概率倍的目标字符串是敲数量. 思维: AC自己主动机+可能性dp简单的问题. 首先建立trie图,然后就是状 ...
- WCF SOAP用法
基本思路 1.新建一个WCF服务库2.在客户端引用处右键,添加服务引用 点击发现,选择目标服务设置好命名空间 可以在高级一栏里面,设置详细信息 点击确认,添加服务引用 3.在客户端自动生成 ...
- WPF依赖项属性不需要包装属性也可以工作
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...