[英]While-loop or threads?
我目前正在使用leJOS 0.9.1 beta
固件編程Lego NXT 2.0
。
我有幾種不同的傳感器,如顏色傳感器和超聲波傳感器。
我正在使用while循環讓機器人向前行駛,直到撞到牆壁。 但是,出於某種原因,我不喜歡這種方法,而是希望實現一個監聽器。 然而,leJOS開發人員寫道,不推薦使用監聽器模型,我應該使用線程來輪詢超聲波傳感器的值。
現在我想知道while循環的實現有多糟糕(操作系統明智,如浪費資源)以及線程模型如何更有益(並實現)?
MWE:
public class SensorTest {
static UltrasonicSensor sonic;
static DifferentialPilot pilot;
public static final int DISTANCE = 20;
public static void main(String[] args){
sonic = new UltrasonicSensor(SensorPort.S1);
pilot = new DifferentialPilot(8.5, 25, Motor.C, Motor.B);
int i = 0;
while (i < DISTANCE) {
pilot.forward();
i = sonic.getDistance();
}
pilot.stop();
}
}
樂高積木沒有任何經驗(我非常嫉妒),你必須問自己一些嚴肅的問題。
在一個簡單的情況下,以這種方式使用循環可能不是一個糟糕的解決方案,但隨着您添加更多,處理每個請求所需的時間(檢查n個傳感器,執行n個操作),它將成為反應遲鈍。
Threaded模型可能允許您處理更多數據,但您可能需要考慮您需要多少線程以及它們正在做什么。
例如,您可以擁有一個Driver
線程,其唯一責任是移動Lego。 這樣做會查詢一些“傳感器”線程以確定它所說的內容,但每個傳感器線程都會以自己的速率輪詢數據而不關心其他任何事情。
您也可以反轉模型,允許Driver
繼續移動,直到Sensor
線程發出某種警報並告訴Driver
它應該改變方向。
我個人會試圖看看我是否可以使用一個線程模型(即使對於一個簡單的設備),因為它將為未來擴展操作提供更大的靈活性......
在一天結束時,它將是平衡行為
真的很嫉妒!
現在我想知道while循環的實現有多糟糕(操作系統明智,如浪費資源)以及線程模型如何更有益(並實現)?
'線程模型'是一個while循環,在主線程以外的某個線程上執行。 如果您擔心資源消耗,您可以讓線程在再次輪詢值之前進入休眠狀態一段固定時間。
至於如何實現它,你必須閱讀API
,但在標准的java程序中,如果你使用的是更新的JDK,你只需要創建一個實現Runnable
接口的類,並將該對象傳遞給線程執行器。
使用線程與輪詢取決於您的情況。 我想在編程微控制器時,一個線程更像是一個中斷。 使用線程(或中斷),您可以更好地模塊化代碼,使其更有效。 看到這個線程 -
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.