>

최근에 멀티 스레드 채팅 애플리케이션을하고있었습니다. 이제 서버로 어려움을 겪고 있습니다. 새로운 필드 online 를 도입하여 서버를 중지하려고합니다. 하지만 도움이되지 않습니다.


import view.ChatHub;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ChatServer extends Thread {
    // All client names, so we can check for duplicates upon registration.
    private static Set<String> names = new HashSet<>();
    // The set of all the print writers for all the clients, used for broadcast.
    private static Set<PrintWriter> writers = new HashSet<>();
    private ChatHub frame;
    private int port;
    private boolean online;
    private ExecutorService pool;
    public ChatServer(int port) throws IOException {
        System.out.println("The chat server is running...");
        this.frame = new ChatHub(this);
        this.port = port;
        this.online = true;
        this.pool = Executors.newFixedThreadPool(500);
        this.start();
    }
    @Override
    public void run() {
        while (this.online) {
            try (ServerSocket listener = new ServerSocket(this.port)) {
                this.pool.execute(new Handler(listener.accept(), this.names, this.writers));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public void stopChatServer() {
        this.pool.shutdown();
        this.online = false;
    }

    public Set<String> getNames() {
        return this.names;
    }
    public Set<PrintWriter> getWriters() {
        return this.getWriters();
    }
    public ChatHub getFrame() {
        return this.frame;
    }
    public int getPort() {
        return this.port;
    }
}

여기서 서버를 닫으려고합니다 :


import Client.ChatClient;
import Server.ChatServer;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class ChatHub extends JFrame{
    JTextField textField;
    JTextArea messageArea;
    public ChatHub(ChatServer server) {
        new JFrame("Chatter");
        this.textField = new JTextField(50);
        this.messageArea = new JTextArea(16,50);
        this.textField.setEditable(true);
        this.messageArea.setEditable(false);
        this.getContentPane().add(this.textField, BorderLayout.SOUTH);
        this.getContentPane().add(new JScrollPane(this.messageArea), BorderLayout.CENTER);
        this.pack();
//        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                server.stopChatServer();
            }
        });
        this.setVisible(true);
    }
    public void appendMessage(String line) {
        messageArea.append(line + "\n");
    }
    public JTextField getTextField() {
        return this.textField;
    }
    public JTextArea getMessageArea() {
        return this.messageArea;
    }
    public void nameAccepted(String line) {
        this.setTitle("Chatter - " + line.substring(13));
        textField.setEditable(true);
    }

}

또한 run 메소드를 사용하려고했습니다.  일부 String 를 인쇄하는 동안 . 그러나 run 를 떠날 때  프로그램이 여전히 작동하고있었습니다. 어떤 제안? 미리 감사드립니다.

또한 run() 를 구현하려고했습니다.  다음과 같이 :

@Override
    public void run() {
        while (this.online) {
            System.out.println("Some String");
        }
        System.out.println(this.isAlive() + "\n");
    }

그리고 true 를 출력합니다  결국.


  • 답변 # 1

    당신은 당신의 online 를 선언하려고 했습니까   volatile 로 속성 ?

    private volatile boolean online = true;
    
    

    속성을 ​​ volatile 로 선언하지 않은 경우 JIT 컴파일러는 부울 속성이 다른 스레드에 의해 변경되지 않는다고 가정 할 수 있습니다. 따라서 실행 방법을 최적화하여

    public void run() {
        if (!online)
            return;
        while(true) {
            try(/*...*/) {
               // ...
            } catch(/*...*/) {
               // ...
            }
        }
    }
    
    

  • 이전 c - 함수 간 포인터 값을 변경하는 방법
  • 다음 python - ANN의 정확도를 최적화하는 방법