如何从for循环中抛出线程?

时间:2019-07-15 12:35:12

标签: java java-threads

它不会创建或启动多个线程。

我试图使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);
    }
}

}

它仅创建并启动第一个线程,启动后的线程的输出符合预期。

2 个答案:

答案 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()方法。

用于Threadhttps://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html)的Javadoc解释了创建新线程的两种方法:

  • 声明一个类为Thread的子类。该子类应重写Thread类的run方法。
  • 创建线程是要声明一个实现Runnable接口的类。然后,该类实现run方法。

两者都应通过调用start()方法(您正在正确执行)来开始,但是两者都需要实现run()来定义线程的行为(上面的代码中没有)

将一些打印输出添加到您的run()方法中可能会有所帮助,如下所示:

@Override
public void run() {
    System.out.println("thread " + this.getName() + " is now running");
    // do other things in thread
}

这将向您显示所有线程都已创建,并且还显示调用start()的顺序与调用run()的顺序不同。