有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Whileloop还是线程?

我目前正在使用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();
      }
}

共 (3) 个答案

  1. # 1 楼答案

    Now I'm wondering how bad the implementation with a while-loop really is (operating system wise, as in wasting of resources) and how a threading model would be more beneficial (and implemented)?

    “线程模型”是一个while循环,在主线程以外的一些线程上执行。如果您担心资源消耗,那么可以让线程在再次轮询某个值之前先休眠一段固定的时间间隔

    至于这是如何实现的,您必须通读API,但是在标准java程序中,如果您使用的是较新的JDK,您只需创建一个实现Runnable接口的类,并将该对象传递给线程执行器

  2. # 2 楼答案

    没有任何关于乐高积木的经验(我很嫉妒)你必须问自己一些严肃的问题

    在一个简单的情况下,以这种方式使用循环可能不是一个坏的解决方案,但随着您增加处理每个请求所需的时间(检查n个传感器,执行n个操作),它将变得反应较慢

    一个线程模型可以让你处理更多的数据,但是你可能需要考虑你需要多少线程和他们在做什么。p>

    例如,您可以有一个Driver线程,其唯一职责是移动乐高。它可以通过查询多个“传感器”线程来确定它在说什么,但每个传感器线程将以自己的速率轮询数据,而不关心其他任何事情

    您还可以反转模型,允许Driver继续移动,直到Sensor线程发出某种警报并告诉Driver它应该改变方向

    就我个人而言,我想看看我是否能让一个线程模型工作(即使对于一个简单的设备),因为它将为将来扩展操作提供更大的灵活性

    最终,这将是一个平衡的行动

    真嫉妒

  3. # 3 楼答案

    使用线程与轮询取决于您的情况。我想在对微控制器编程时,线程更像是一个中断。使用线程(或中断)可以更好地模块化代码,使其更高效。看这条线-

    Polling or Interrupt based method