简要控制另一个线程拥有的对象

时间:2014-07-22 11:13:11

标签: java multithreading lejos-nxj

我有一个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();
    }

现在告诉我现在的方向&#34;&#34;功能,它属于同一类:

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

所需行为:每当&#34; getDistanceInDirection&#34;如果被调用,它必须暂时停止扫描并转向给定方向,返回距离并继续扫描。

告诉扫描仪线程执行第二个功能所需的时间是正确的方法是什么?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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永远不会同时运行