0

run() メソッドは次のとおりです。

public void run() {         
    ServerSocket listener = null;           
    if (running == true) {
        btnRun.setEnabled(false);
        try {
            if (!(portField.getText().equals(""))) {                
                String p = portField.getText();
                if (p.matches("[0-9]*")) {                          
                    listener = new ServerSocket(Integer.parseInt(p));                           
                    while (true) {
                        Socket socket = listener.accept();
                        try {
                            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                            out.println("Hi there, human.");    
                        } finally {
                            socket.close(); 
                        }
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "Only numbers are allowed.");
                    btnRun.setEnabled(true);
                    running = 
                }
            } else {
                JOptionPane.showMessageDialog(null, "Please input a port.");
                btnRun.setEnabled(true);
                running = false;
            }
        } catch (NumberFormatException | HeadlessException | IOException e) {               
            e.printStackTrace();
        }
    } else {
        btnRun.setEnabled(true);
        if (listener != null) {
            try {
                listener.close();
            } catch (IOException e) {                       
                e.printStackTrace();
            }
        }
    }
}

ボタンは次のとおりです。

btnRun = new JButton("Run Server");
btnRun.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
        if (running == false) {
            running = true;
                run();
        }
    }               
});

ボタンをクリックすると、ソフトウェアがフリーズします (while (true) ループ内でエンドレスに実行されてしまいます)。私の知る限り、このループを別の「スレッド」で実行し、GUI を別のスレッドで実行する必要があります。しかし、問題は、Runnable インターフェースを実装することで、まさにこれを行っていると思っていたことです。

スレッド内 (true) でこれを分離するにはどうすればよいですか?"JFrame.EXIT_ON_CLOSE"*

4

1 に答える 1

10

Runnable を実装するだけでは不十分です。明示的にスレッドを開始する必要があります。

Thread myThread = new Thread(myRunnable);
myThread.start();
于 2013-06-30T23:36:17.167 に答える