2 tongyiwzh tongyiwzh 于 2016.09.08 10:50 提问

Java中线程wait是如何实现微秒级别识别外界的唤醒动作的

一直以来都惊奇于java是如何实现微秒级别唤醒一个处于wait状态的线程的,今天我通过下面的
程序测试了一下,主线程从调用 notify 到唤醒一个处于 wait 状态的子线程,之间的时间间隔小
于7微秒,这是一个非常短的时间,想知道java在这方面的底层实现原理是什么,有没有其他类似的
的工具也能实现这种耗时非常短的协调交互功能?
为什么想了解这个呢,因为我最近想做个在分布式环境下线程互相协调的工具,其中一个基础功
能需要让一个线程能尽快识别其他线程对临界资源的更新,因为不再是单JVM环境了,所以无法使用线程临界区的 notify, wait 机制快速唤醒另外一个等待的线程了,在分布式环境下,希望一个处于等待状态的线程通过自旋等待的方式尽快识别临界区资源的变动,用 while + sleep 方式还是延迟太大了,希望能从 wait + notify 的实现原理中找下思路,或者各位有更好的推荐方案也行。

下面是我测试 wait , notify 时间间隔的代码,有兴趣的可以看下:

public class TestThreadWait {
public static void main(String[] args) {
Object lock = new Object();
T1 thread = new T1(lock);
thread.start();

    try {
        Thread.sleep(500);
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }

    long time1 = 0l;
    long time2 = 0l;
    synchronized(lock) {
        time1 = System.nanoTime();
        lock.notify();
        time2 = System.nanoTime();
    }
    System.out.println("main thread notify time info : time1 = " + time1 + ", time2 = " + time2 + ", cost : " + (time2-time1));
}

static class T1 extends Thread {
    private Object lock;

    public T1(Object lock) {
        this.lock = lock;
    }

    public void run() {
        long time1 = 0l;
        long time2 = 0l;
        synchronized(this.lock) {
            try {
                time1 = System.nanoTime();
                this.lock.wait();
                time2 = System.nanoTime();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("thread wait time info : time1 = " + time1 + ", time2 = " + time2 + ", cost : " + (time2-time1));
    }
}

}

1个回答

tongyiwzh
tongyiwzh   2016.09.08 13:46

没人对这个有兴趣吗?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java线程之等待wait唤醒notify示例(一)
线程等待,线程唤醒 “锁“中的主要方法 wait(): 让线程处于冻结状态,被wait的线程会被存储到线程池中。 notify():唤醒线程池中一个线程(任意),没有顺序。 notifyAll():唤醒线程池中的所有线程。 因为synchronized模块的监视器是任意对象,所以这些方法定义在Object中注意: **这些方法都必须定义在同步中。因为这些方法是用于操作线程状态
【Java并发编程】之十:使用wait/notify/notifyAll实现线程间通信的几点重要说明
在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信。在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调用notify()方法或notifyAll()方法),在线程中调用notify()方法或notifyAll()方法,将通知其他线程从wait()方法处返回。 Object是所有类的超类,它有5个方法组成了等待/通知机制的核心:notify()、notifyAll()、wait()、wait(
java 线程 join(wait) 后,是如何唤醒
Join 方法:本质上还是根据wait方法实现的。分析join源码发现join方法本身是使用了synchronized修饰符的。是加在方法上面的,意味着。 获取了当前对象的锁,然后继续发现里面的代码调用了wait。意味着我们先锁,再释放,等待唤醒,什么情况下被唤醒呢:   仔细查看join的源码,发现调用了wait(0),让程序等待,那么什么时间锁被释放呢?。因为是以线程对象作为锁的:
线程的等待唤醒机制
等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下: wait: 告诉当前线程放弃执行权,并放弃监视器(锁)并进入阻塞状态,直到其他线程持有获得执行权,并持有了相同的监视器(锁)并调用notify为止。 notify: 唤醒持有同一个监视器(锁)中调用wait的第一个线程,例如,餐馆有空位置后,等候就餐最久的顾客最先入座。注意:被唤醒的线程是进入了可运行状态。等待cpu
多线程等待唤醒机制:从wait()和sleep()的差别说起
1. wait():释放资源,释放锁 sleep():释放资源,不释放锁 wait():Object的方法,用在同步当中,是同步锁的方法,以锁控制线程 sleep():线程类Thread本身的静态方法 例子: class Person { String name; String gender; boolean flag=false;//标记,默认不输出 } cla
java线程虚假唤醒
 public class MyStack {          private List list = new ArrayList();                public synchronized void push(String value) {              synchronized (this) {                  list
java 线程wait()与notify()的用法(被唤醒后的线程到底重新执行同步代码块还是从那是等待的那里继续执行)
java 线程wait()与notify()的用法(被唤醒后的线程到底重新执行同步代码块还是从那是等待的那里继续执行)   2013-09-24 22:15:58|  分类: java |举报 |字号 订阅 我们先来看看这两个方法的定义:       wait()   导致当前线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()方
Java线程的挂起与恢复 wait(), notify()方法介绍
一, 什么是线程的挂起与恢复 从字面理解也很简单. 所谓线程挂起就是指暂停线程的执行(阻塞状态). 而恢复时就是让暂停的线程得以继续执行.(返回就绪状态) 二, 为何需要挂起和恢复线程. 我们来看1个经典的例子(生产消费): 1个仓库最多容纳6个产品, 制造者现在需要制造超过20件产品存入仓库, 销售者要从仓库取出这20件产品来消费. 制造和消费的速度很可能是不一样的
哪几种方式可用来实现线程间通知和唤醒
wait()、notify()和notifyAll()是 Object类 中的方法 从这三个方法的文字描述可以知道以下几点信息: 1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁) 3)调用某个对象的n
多线程wait等待和notify唤醒
package com.ibeidou.thread; /**  * 测试wait和notify方法  * 两个线程操作同一对象,一个线程调用wait方法,另一个之后调用notify方法  * 等待是当前线程对对象等待,唤醒是线程对等待对象的所有线程唤醒(可随机唤醒一个,可唤醒所有的)  * @author sam 2012-4-11  */ public class TestWai