tongyiwzh 2016-09-08 02:50 采纳率: 0%
浏览 1683

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));
    }
}

}

  • 写回答

3条回答 默认 最新

  • tongyiwzh 2016-09-08 05:46
    关注

    没人对这个有兴趣吗?

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。