Java 如何从一个for循环中抛出线程?
它不会创建或启动多个线程 我试图使poller类实现runnable,并使用run()调用它。还使它从线程扩展并使用start()调用它。我在调用函数pollRows()中添加了System.out.println(I),它只打印“1”Java 如何从一个for循环中抛出线程?,java,java-threads,Java,Java Threads,它不会创建或启动多个线程 我试图使poller类实现runnable,并使用run()调用它。还使它从线程扩展并使用start()调用它。我在调用函数pollRows()中添加了System.out.println(I),它只打印“1” public void pollRows()引发InterruptedException{ 对于(int i=1;i
public void pollRows()引发InterruptedException{
对于(int i=1;i<17;i++){
系统输出打印LN(i);
轮询器rowPollerThread=新轮询器(端口,行[i]);
rowPollerThread.start();
}
}
公共类轮询器扩展线程{
专用静态字节[]轮询字节={
(字节)0x01,(字节)0x03,(字节)0x00,(字节)0x10,(字节)0x00,(字节)0x08,(字节)0x45,(字节)0xc9
};
私有静态字节[]轮询字节;
私有静态com.fazecast.jSerialComm.SerialPort SerialPort;
私有静态行;
公共轮询器(com.fazecast.jSerialComm.SerialPort SerialPort,Row){
this.serialPort=serialPort;
this.row=行;
}
@凌驾
公开作废开始(){
试一试{
while(true){
getHelioStates();
}
}捕获(中断异常例外){
Logger.getLogger(Poller.class.getName()).log(Level.SEVERE,null,ex);
}
}
私有静态void getHelioStates()引发InterruptedException{
对于(inti=0;i
}
它只创建并启动第一个线程,已启动线程的输出与预期一致。不要覆盖Poller类的start方法,因为start方法会导致线程开始执行。您应该重写run方法
@Override
public void run() {
try {
while (true) {
getHelioStates();
}
} catch (InterruptedException ex) {
Logger.getLogger(Poller.class.getName()).log(Level.SEVERE, null, ex);
}
}
不要重写Poller类的start方法,因为start方法会导致线程开始执行。您应该重写run方法
@Override
public void run() {
try {
while (true) {
getHelioStates();
}
} catch (InterruptedException ex) {
Logger.getLogger(Poller.class.getName()).log(Level.SEVERE, null, ex);
}
}
由于未定义
run()
方法,线程无法正常工作
Javadoc forThread
()解释了创建新线程的两种方法:
- 将类声明为线程的子类。这个子类应该重写类Thread的run方法
- 创建线程是为了声明一个实现可运行接口的类。然后该类实现run方法
start()
方法来启动(这是正确的做法),但是这两种方法都需要实现run()
来定义线程的行为(这不在上面的代码中)
向run()
方法添加一些打印输出可能会有所帮助,如下所示:
@Override
public void run() {
System.out.println("thread " + this.getName() + " is now running");
// do other things in thread
}
这将显示所有线程都已创建,还显示调用
start()
的顺序与调用run()
的顺序不同。由于未定义run()
方法,线程无法正常工作
Javadoc forThread
()解释了创建新线程的两种方法:
- 将类声明为线程的子类。这个子类应该重写类Thread的run方法
- 创建线程是为了声明一个实现可运行接口的类。然后该类实现run方法
start()
方法来启动(这是正确的做法),但是这两种方法都需要实现run()
来定义线程的行为(这不在上面的代码中)
向run()
方法添加一些打印输出可能会有所帮助,如下所示:
@Override
public void run() {
System.out.println("thread " + this.getName() + " is now running");
// do other things in thread
}
这将显示所有线程都已创建,还显示调用
start()
的顺序与调用run()
的顺序不同。创建新线程需要start()
而不是run()
。但你说你试过了。发生了什么事?有错误吗?你怎么知道没有额外的线程?能否在无限循环之前添加一些System.out.println()
进行调试?getHelioStates()
做什么?我想这与以下事实有关:启动的线程永远不会结束,因为run方法包含一个bucle,而getHelioStates阻塞(true)呢?在任何情况下,只需在for循环的最后一行添加日志。您将看到有多少线程已启动。该线程有什么问题?有什么特别的原因需要重新发明wheal吗?“我想这与启动的线程永远不会结束这一事实有关,因为run方法包含一个bucle,而(true)“不,这是因为您从未启动/启动另一个线程。调用start()
而不是run()
您需要start()
而不是run()
来创建新线程。但你说你试过了。发生了什么事?有错误吗?你怎么知道没有额外的线程?能否在无限循环之前添加一些System.out.println()
进行调试?getHelioStates()
做什么?我想这与以下事实有关:启动的线程永远不会结束,因为run方法包含一个bucle,而getHelioStates阻塞(true)呢?在任何情况下,只需在for循环的最后一行添加日志。您将看到有多少线程已启动。该线程有什么问题?有没有什么具体的原因让我们重新发明风团?“我想这与