2016-11-19 5 views
1

현재 로봇에서 작업 중입니다. 나는 EV3 레고 벽돌을 사용합니다. 내 목표는 가장 짧은 경로를 사용하여 travelTo (x, y) 메소드를 사용하여 A 지점에서 B 지점으로 이동하는 것입니다. 이 메서드는 스레드 이름 Drive에 있습니다.이 메서드는 내 로봇의 이동을 제어하는 ​​데 사용되는 모든 메서드 (turnTo (double angle), travel (double distance), travelTo (double x, double y), changeSpeed ​​(int newSpeed))를 포함합니다. ..). 전방에 장애물이있는 경우 스레드 드라이브를 중지하고 장애물을 피하기 위해 P 제어기 기술을 사용하여 장애물을 피하기 시작한 ObstacleAvoidance라고하는 다른 스레드가 있습니다.다중 스레드 문제 - 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'가 있습니까? 왜냐하면 당신은 스레드 객체에 대해서'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를 잡을 후 무엇을 결정해야합니다. 당신의 로봇이 어떻게 작동하는지 모르겠으므로 스레드를 막을 것을 권장합니다. 장애물을 처리하는 방법을 계산 한 후에 다른 드라이브 위협을 시작할 수 있습니다.