홈>
최근에 멀티 스레드 채팅 애플리케이션을하고있었습니다. 이제 서버로 어려움을 겪고 있습니다. 새로운 필드
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
관련 질문
- java : blockingQueue에서 JList를 표시하는 방법은 무엇입니까?
- java : 멀티스레딩에서 폴링 줄이기
- java : 스레드 무한 루프에서 JFrame 패널 업데이트
- Java에서 다중 스레드 프로그램 디버깅을 위한 IDE 지원
- submit() executorService Java [중복]
- java : ThreadLocal: 한 스레드의 변경 사항이 다른 스레드에서 보이는 이유
- java : ForkJoinPool::shutdown 대 ForkJoinPool::shutdown지금 ForkJoinPool::join 이후
- java : J2Mod를 사용하여 Android에서 Modbus Slave에 대한 연결을 어떻게 모니터링합니까?
- java : 큐를 사용하는 생산자/소비자 스레드
- python : 동기 스레드와 비동기 스레드를 구별하는 방법은 무엇입니까?
당신은 당신의
online
를 선언하려고 했습니까volatile
로 속성 ?속성을
volatile
로 선언하지 않은 경우 JIT 컴파일러는 부울 속성이 다른 스레드에 의해 변경되지 않는다고 가정 할 수 있습니다. 따라서 실행 방법을 최적화하여