2016-11-19 8 views
1

現在、ロボットで作業中です。私はEV3レゴレンガを使用しています。私の目標は、最短経路を使ってtravelTo(x、y)メソッドを使ってA点からB点に移動することです。このメソッドはスレッド名Driveにあり、私のロボット(turnTo(double angle)、travel(double distance)、travelTo(double x、double y)、changeSpeed(int newSpeed))の動きを制御するためのすべてのメソッドが含まれています。 ..)。 私はObstacleAvoidanceと呼ばれる別のスレッドを持っています。これは、障害物が前面にある場合にスレッドドライブを停止し、障害物に追従するためにPコントローラ技術を使用して障害物を回避することを開始します。マルチスレッドの問題 - 使用するメソッドのJAVA thread.wait()

私の問題は、私のPコントローラがスレッドドライブ内のメソッドを使用していることです。したがって、障害が発生したら私はできません:

if (obstacle){  
    Drive.wait(); 
    while(isAvoiding){ 
    pControler(); 
    } 
} 
Drive.Notify(); 


private void pController(){ 
    //use methods inside the DriveThread 
} 

どうすればこの問題を回避できますか?言い換えれば、私はどのように私のロボットの現在のアクションを停止し、ブロックを避け、私がやっていたことを続けることができますか?

+0

ここで 'java.lang.Thread'sについて話していますか?なぜなら、あなたはスレッドオブジェクトに対して 'wait()'と 'notify()'を呼び出すはずがないからです。 – biziclop

+1

メソッドはオブジェクト上にあり、そのオブジェクトが別のスレッドによって呼び出されたスレッドからそれを停止してはならないかどうかを表します。そして、機能する前に他のものを停止しなければならない場合、なぜ機能を2つのスレッドに分割するのですか?私はロボット工学について何も知らないが、これは物事がどのように整理されているのか疑問に思う。 –

答えて

0

障害物がパス内にある場合、Thread.interrupt()を使用してドライブスレッドを中断できます。その後、障害物に対処する方法を計算して、再びドライブすることができます。

https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt--

あなたはドライブのスレッドでhttps://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.htmlをキャッチし、次に何をすべきかを決定する必要があります。私はあなたのロボットがどのように動作するのかわからないので、スレッドを止めさせることをお勧めします。障害に対処する方法を計算した後、別のドライブ脅威を開始することができます。

関連する問題