Java:如何实现一个不阻塞程序其余部分的 portlistener

Java: How to implement a portlistener that doesn't block the rest of the program

提问人:JeroenV 提问时间:8/26/2013 最后编辑:Stephen CJeroenV 更新时间:8/26/2013 访问量:121

问:

我有定义 Java FX 场景和阶段的类,还有一个创建数据库连接并启动 .这 3 个不同的部分(和 Port Listener)在单独测试时都起作用,但是当我取消注释这些部分以便我可以完全工作地测试程序时,它不起作用。MainMainControllerPortListenerViewsDB connection

public class Main extends Application {
MainController mainController;

@Override
public void start(Stage primaryStage) {
    BorderPane root = new BorderPane();
    Scene scene = new Scene(root, 1100, 690);

    root.setTop(setupMenuBar());
    root.setCenter(setupCenter());
    root.setBottom(setupStatusBar());

    scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
    primaryStage.setScene(scene);

    mainController = new MainController();
    mainController.initController(primaryStage);

    primaryStage.show();
}

问题是我从来没有进入过主程序,因为它只是坐着等待传入的消息,所以在我看来只有一个线程在运行。(我以为java默认是多线程的)primaryStage.show();portlistener

应该等待传入的消息,但不应阻止程序运行。我已经更改了实现,但我在某处读到应该从另一个类中新创建的线程的方法调用可运行对象的方法。portlistenerMainPortlistenerRunnablerun()start()

现在有一个问题,我在 中创建了一个函数,它有 2 个参数,一个是 to listening to,另一个是 instance,因此一旦有传入消息,就可以调用一个函数。具有数据库连接和端口号等变量,实际上是所有内容汇集在一起的类。startListeningportListenerportNumbermainControllerportlistenerMainControllerMainController

这:PortListener

public class PortListener implements Runnable {
    boolean stayConnected = true;
    MainController mainController;
    ServerSocket serverSocket;
    Socket clientSocket = null;

    public void startListening(int portNumber, MainController controller) throws IOException {
        mainController = controller;
        try {
            serverSocket = new ServerSocket(portNumber);
            serverSocket.setReuseAddress(true);
        } 
        catch (IOException e) {
            System.err.println("Could not start listener on port: " + portNumber);
            return;
        }

        while(stayConnected) {
            run();
        }
    }

    public void run() {
        try {
            clientSocket = serverSocket.accept();
            System.out.println("Connection established");

            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String inputLine;

            while ((inputLine = in.readLine()) != null) {
                // TODO: handle incoming message by calling mainController
                System.out.println("Line incoming: " + inputLine);
            }
            in.close();

            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            System.err.println("Portlistener run() failed: " + e.getMessage());
        }
    }

    public void stopListening() {
        stayConnected = false;
    }
}

我可能只是错过了一些微不足道的东西,但由于这里有这么多熟练的程序员,我宁愿问我错过了什么,而不是再尝试一个小时(或两个小时)。

Java 多线程 侦听器

评论

0赞 Marko Topolnik 8/26/2013
是的,您必须使用其中之一或将 runnable 提交到 Executor Service。new Thread(myRunnable).start()
0赞 tilpner 8/26/2013
I thought java was multithreaded by default: 它是,在后台...不过,默认情况下它不会完成您的工作......
0赞 JeroenV 8/26/2013
@Marko:但是你如何传递参数呢?
0赞 Marko Topolnik 8/26/2013
不清楚你在问什么,但大多数情况下,你会把所有数据传递给构造函数。myRunnable
0赞 JeroenV 8/26/2013
这就是我需要的,哎呀,一定是星期一,我不记得这么基本的事情......谢谢!

答: 暂无答案