java多线程代码有什么问题?
在我的服务器类中,我有以下代码。 为什么执行流从未到达服务器类中的while循环
// Server
public class Server {
public void start(String remote, int rport) {
try {
new Thread(new Source(this)).start();
ServerSocket listenSocket = new ServerSocket(port);
while (true) {
Socket clientSocket = listenSocket.accept();
ServerConnection connection = new ServerConnection(clientSocket, this);
System.out.println("sdssssaafffffaddfasfd");
new Thread(connection).start();
}
} catch (IOException e) {
System.out.println("Listen socket:" + e.getMessage());
}
}
}
在实现Runnable的源类中,我有:
public class Source implements Runnable {
private final Server server;
public Source(Server server) {
this.server = server;
}
@Override
public void run() {
Viewer myViewer = new Viewer();
JFrame frame = new JFrame("Simple Stream Viewer");
frame.setSize(320, 240);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(myViewer);
OpenIMAJGrabber grabber = new OpenIMAJGrabber();
Device device = null;
Pointer<DeviceList> devices = grabber.getVideoDevices();
for (Device d : devices.get().asArrayList()) {
device = d;
break;
}
boolean started = grabber.startSession(320, 240, 30, Pointer.pointerTo(device));
if (!started) {
throw new RuntimeException("Not able to start native grabber!");
}
while (true) {
// code runs infinitely here...
}
}
}
# 1 楼答案
猜测,但使用swing时,需要确保事件处理在正确的线程中完成
# 2 楼答案
问题在于这里的调试方法。在没有客户机连接的情况下使用调试器将不会在第一次调用}-loop中放入一个
accept()
方法之后继续进行。为了找出问题,需要在调用accept()
之前,在Server
{System.out.println()
语句,并检查是否进入了循环