有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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...
        }
    }
}

共 (2) 个答案

  1. # 1 楼答案

    猜测,但使用swing时,需要确保事件处理在正确的线程中完成

        final JFrame frame = new JFrame("Simple Stream Viewer");
        frame.setSize(320, 240);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(myViewer);
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
               frame.setVisible(true);
            }
        }
    
  2. # 2 楼答案

    问题在于这里的调试方法。在没有客户机连接的情况下使用调试器将不会在第一次调用accept()方法之后继续进行。为了找出问题,需要在调用accept()之前,在Server{}-loop中放入一个System.out.println()语句,并检查是否进入了循环