感谢网友圈圈妈 的翻译
线程,监听和事件
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();
}
}
返回顶部
|