线程,监听和事件
感谢网友圈圈妈 的翻译


线程,监听和事件

Java线程

当一个Java程序运行时,只有一个线程 – 主线程。

大多数LeJOS类都会因为不同的目的开始额外的线程。例如:

  • 如果监听在使用,那么按钮和传感器端口会开始一个监听线程
  • 每个马达都会开始一个调节器线程
  • 蓝牙类会开始一个可以与分开的蓝牙芯片对话的线程
  • 每个定时器会打开一个定时器线程

用户程序会通过子类线程创建他们自己的线程,然后可以使用开始的方法打开这个线程。在LeJOS NXJ0.7中,可以通过执行运行接口的任何类创建线程。

后台线程不必因为停止用户程序而停止,应该通过唤起设置守护(为真)标记为守护线程

当使用线程时,应该特别注意并发出现的问题。当数据项目通过多线程进入时,需要确认同步,当在不稳定状态下,数据不应该已读。

LeJOS支持标准Java同步办法:同步方法和同步状态使用一个监视器设备。在LeJOS处理并发和同步时,有一些约束 – 详见leJOS NXJ README.html文件。

作为LeJOS线程的一个例子,应考虑下在leJOS StartUpText菜单中的指示线程。这是通过每秒读取它的数值来指示现在的电池级别,同时也用来指示菜单上载文件或与PC做其他通讯。


import lejos.nxt.LCD;

class Indicators extends Thread {
  private boolean io = false;

  public void ioActive() {
    io = true;
  }

  public void run() {
    String[] ioProgress = { ".   ", " .  ", "  . " };
    int ioIndex = 0;
    boolean rewrite = false;
    while (true) {
      try {
        if (io) {
          StartUpText.g.drawString("     ", 76, 0);
          ioIndex = (ioIndex + 1) % ioProgress.length;
          StartUpText.g.drawString(ioProgress[ioIndex], 78, 0);
          io = false;
          rewrite = true;
        } else if (rewrite) {
          LCD.drawString("   ", 13, 0);
          // invert when power is off
          StartUpText.g.drawString(" BT", 82, 0, !StartUpText.btPowerOn);
          StartUpText.g.refresh();
          rewrite = false;
        }
        Thread.sleep(1000);
      } catch (InterruptedException ie) {
      }
    }
  }
}			

开始这个线程的主要方法:


  Indicators ind = new Indicators();
  ind.setDaemon(true);	
  ind.start();
  			

返回顶部

监听和事件

LeJOS有一个监听线程用来监听特定的事件

该监听线程支持:

  • 按键监听
  • 传感器端口监听

无论你的程序此刻在做什么,按键监听都可以检测到一个按键被按下

如果要监听一个特定的按键被按下,则需要为这个按键开个寄存器

例如:


import lejos.nxt.*;

public class ListenForButtons {
  public static void main(String[] args) throws Exception {
    Button.ENTER.addButtonListener(new ButtonListener() {
      public void buttonPressed(Button b) {
        LCD.drawString("ENTER pressed", 0, 0);
      }

      public void buttonReleased(Button b) {
        LCD.clear();
      }
    });

    Button.ESCAPE.waitForPressAndRelease();
  }
}
  			

返回顶部