多线程中的通信是非常重要的概念,线程直接实现通信就可以并发完成很多复杂工作。

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的更多相关文章

  1. java多线程之wait和notify协作,生产者和消费者

    这篇直接贴代码了 package cn.javaBase.study_thread1; class Source { public static int num = 0; //假设这是馒头的数量 } ...

  2. Java多线程之Wait()和Notify()

    1.Wait()和Notify.NotifyAll都是Object的方法 2.多线程的协作是通过控制同一个对象的Wait()和Notify()完成 3.当调用Wait()方法时,当前线程进入阻塞状态, ...

  3. Java多线程之wait、notify/notifyAll 详解,用wait 和notifyAll 以及synchronized实现阻塞队列,多线程拓展之ReentrantLock与Condition

    前言:这几天看了很多关于多线程的知识,分享一波.(但是目前接触的项目还未用到过,最多用过线程池,想看线程池 请看我之前的博客) 关于基本的理论等 参考如下: https://www.cnblogs.c ...

  4. java 多线程之synchronized wait/notify解决买票问题

    一.Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的st ...

  5. 1.Java多线程之wait和notify

    1.首先我们来从概念上理解一下这两个方法: (1)obj.wait(),当obj对象调用wait方法时,这个方法会让当前执行了这条语句的线程处于等待状态(或者说阻塞状态),并释放调用wait方法的对象 ...

  6. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  7. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  8. java多线程之yield,join,wait,sleep的区别

    Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...

  9. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

随机推荐

  1. Android SDK location should not contain whitespace, as this cause problems with NDK tools

    解决方案一: The easiest solution is to move the SDK somewhere else, where there is no space or other whit ...

  2. Jsp bug_001

    报错: The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解 ...

  3. Javascript 基准测试

    http://bubkoo.com/2014/02/18/bulletproof-javascript-benchmarks/

  4. Android设备与外接U盘实现数据读取操作

    现在越来越多手机支持OTG功能,通过OTG可以实现与外接入的U盘等USB设备实现数据传输.关于OTG,可以参考: http://blog.csdn.net/srw11/article/details/ ...

  5. servlet-显示器

    1.什么是监听器 监听器是实现一个特定的接口java规划,该计划的目的是还调用类方法监听器.java的awt大量使用该模式,如的能力button点击事件.当鼠标点击时,就会调用事件处理程序.又如:在j ...

  6. 北大SQL数据库视频课程笔记

    Jim Gray - Transaction processing: concepts and techniqueshttp://research.microsoft.com/~gray/ 事务概念 ...

  7. AvalonDock的基本用法

    原文:AvalonDock的基本用法         AvalonDock是优秀的开源项目,用于创建可停靠式布局,能够在WPF中方便开发出类似VS2010的软件界面.对于复杂的软件系统,大量控件的使用 ...

  8. Matlab Tricks(二十六)—— 置乱(随机化)与恢复(shuffle/permutation & restore)

    x = 1:10; n = length(x); perm = randperm(n); x_perm = x(perm); % x_perm 表示置乱后的结果 x_ori(perm) = x_per ...

  9. JS超链接动态显示图片

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  10. jquery 调用js成员

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...