它不会创建或启动多个线程。
我试图使poller类实现可运行并使用run()调用它。还使它从线程扩展并使用start()调用它。我在调用程序函数pollRows()中添加了System.out.println(i),它只显示“ 1”。
public void pollRows() throws InterruptedException {
for (int i = 1; i < 17; i++) {
System.out.println(i);
Poller rowPollerThread = new Poller(port, rows[i]);
rowPollerThread.start();
}
}
public class Poller extends Thread {
private static byte[] pollerBytes = {
(byte) 0x01, (byte) 0x03, (byte) 0x00, (byte) 0x10, (byte) 0x00, (byte) 0x08, (byte) 0x45, (byte) 0xc9
};
private static byte[] polledBytes;
private static com.fazecast.jSerialComm.SerialPort serialPort;
private static Row row;
public Poller(com.fazecast.jSerialComm.SerialPort serialPort, Row row) {
this.serialPort = serialPort;
this.row = row;
}
@Override
public void start() {
try {
while (true) {
getHelioStates();
}
} catch (InterruptedException ex) {
Logger.getLogger(Poller.class.getName()).log(Level.SEVERE, null, ex);
}
}
private static void getHelioStates() throws InterruptedException {
for (int i = 0; i < row.getHeliostats().length; i++) {
writeFrame(i);
readByteFrame();
setHelioStates(row.getHeliostats()[i]);
Thread.sleep(1000);
}
}
private static void writeFrame(int i) {
pollerBytes[0] = (byte) row.getAddresses()[i];
serialPort.writeBytes(pollerBytes, 8);
}
private static void readByteFrame() {
polledBytes = new byte[serialPort.bytesAvailable()];
serialPort.readBytes(polledBytes, polledBytes.length);
}
private static void setHelioStates(Heliostat heliostat) {
for (int i = 0; i < polledBytes.length; i++) {
Byte b = polledBytes[i];
heliostat.bytePosition(i, b);
}
}
}
它仅创建并启动第一个线程,启动后的线程的输出符合预期。
答案 0 :(得分:2)
不要覆盖Poller类的start方法,因为start方法导致线程开始执行。您应该覆盖运行方法。
@Override
public void run() {
try {
while (true) {
getHelioStates();
}
} catch (InterruptedException ex) {
Logger.getLogger(Poller.class.getName()).log(Level.SEVERE, null, ex);
}
}
答案 1 :(得分:0)
您的线程无法正常工作,因为您尚未定义run()
方法。
用于Thread
(https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html)的Javadoc解释了创建新线程的两种方法:
两者都应通过调用start()
方法(您正在正确执行)来开始,但是两者都需要实现run()
来定义线程的行为(上面的代码中没有)
将一些打印输出添加到您的run()
方法中可能会有所帮助,如下所示:
@Override
public void run() {
System.out.println("thread " + this.getName() + " is now running");
// do other things in thread
}
这将向您显示所有线程都已创建,并且还显示调用start()
的顺序与调用run()
的顺序不同。