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

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. Multiple address space mapping technique for shared memory wherein a processor operates a fault handling routine upon a translator miss

    Virtual addresses from multiple address spaces are translated to real addresses in main memory by ge ...

  2. Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来

    首先题外话,今天早上起床的时候,手滑一下把我的手机甩了出去,结果陪伴我两年半的摩托罗拉里程碑一代就这么安息了,于是我今天决定怒更一记,纪念我死去的爱机. 如果你是网购达人,你的手机上一定少不了淘宝客户 ...

  3. eclipes中配置javadoc文档

  4. C#常用多线程方法

    1.  Thread类 C#多线程编程中Thread类需要包含名称空间System.Threading. class Program { static void Main(string[] args) ...

  5. 转:spring MVC HTTP406 Not Acceptable

    springMVC框架下,ajax请求,在用json对象返回的时候,可以用如下的形式: response.setContentType("text/html;charset=UTF-8&qu ...

  6. 相关web 片段记录安全性研究(不时更新)

    一.有关html/css, js, php, cgi 的一些认识 当我们浏览器訪问一个网站的静态文件.会把文件内容都下载下来(一般压缩).当然假设遇到外联的css/js,会再发起请求得 到.假设我们右 ...

  7. 网络编程Socket它TCP它TIME_WAIT国家具体解释

    下面我们用最简单的一对一的客户server编程模型重现遇到的一些问题: 初学者socket当写作socket名其妙的问题.比方说bind函数返回的常见错误是EADDRINUSE 使用以下的程序重现这个 ...

  8. Invalid default value for 'created_at'

    https://github.com/laravel/framework/issues/15144 https://stackoverflow.com/questions/30555844/larav ...

  9. C 语言main 函数终极探秘(&& 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行)

           所有的C程序必须定义一个称之为main的外部函数,这个函数是程序的入口,也就是当程序启动时所执行的第一个函数,当这个函数返回时,程序也将终止,并且这个函数的返回值被看成是程序成功或失败的 ...

  10. apt-spy 软件源更新

    ebian上的apt-get是最快的软件安装方式,不过要用好apt-get,首先得需要找到最快的源,这样安装软件的时候才能获得好的速度,用起来才能得心应手. 有的源在用了一段以后,就会失效,这个时候, ...