0

我有一个 Java 控制的机器人。它有一个超声波传感器,由电机 B 来回旋转。

通常,我有一个单独的线程来扫描环境并将收集到的数据发送到另一台机器以绘制地图。

但是,有时主线程需要短暂使用传感器来查看特定方向。

这是我的扫描仪线程:

public void run() {
        while (!stop) {
            Motor.B.forward();

            while (Motor.B.getTachoCount() < 90 && !stop) {
                try{Thread.sleep(20);} catch (InterruptedException ex) {ex.printStackTrace();}

                Mapperbot.sendCommand("S US "+sonic.getDistance()+" "+Motor.B.getTachoCount());
            }

            Motor.B.backward();

            while (Motor.B.getTachoCount() > -90 && !stop) {
                try{Thread.sleep(10);} catch (InterruptedException ex) {ex.printStackTrace();}
            }
        }

        Motor.B.stop();
    }

这是“现在告诉我方向”功能,它属于同一类:

public synchronized int getDistanceInDirection(int direction) {
    Motor.B.rotateTo(direction);
    return sonic.getDistance();
}

所需行为:每当调用“getDistanceInDirection”时,它必须短暂停止扫描并转向给定方向,返回距离并继续扫描。

告诉我的扫描程序线程执行第二个函数所需的时间的正确方法是什么?

4

2 回答 2

0

扔一个synchronized(this)

public void run() {
    while (!stop) {
        synchronized(this) {
            Motor.B.forward();

            while (Motor.B.getTachoCount() < 90 && !stop) {
                try{Thread.sleep(20);} catch (InterruptedException ex) {ex.printStackTrace();}

                Mapperbot.sendCommand("S US "+sonic.getDistance()+" "+Motor.B.getTachoCount());
            }

            Motor.B.backward();

            while (Motor.B.getTachoCount() > -90 && !stop) {
                try{Thread.sleep(10);} catch (InterruptedException ex) {ex.printStackTrace();}
            }
        }
    }

    Motor.B.stop();
}

这将确保循环内容和getDistanceInDirection永远不会同时运行

于 2014-09-13T09:44:14.257 回答
0

我会使用信号量:

final Semaphore semaphore = new Semaphore(1);

//in the scanner thread
semaphore.acquire();
try {
    while (! stop) {
        semaphore.release();
        semaphore.acquire();
        ...use sensor...
} finally {
    semaphore.release();
}

//in the main thread
semaphore.acquire();
try {
    ...use sensor...
} finally {
    semaphore.release();
}
于 2014-07-22T13:31:32.557 回答