【发布时间】:2019-01-10 15:24:14
【问题描述】:
我使用 propertychangesupport、propertychange 和 fireproperty change 编写 java 程序,现在它可以工作,但根本不是这样当我把它放在while条件下时,改变它只是想退出循环,
公共类主{
public static void main(String[] args) {
CLI cli = new CLI(System.in,System.out);
Server server = new Server(34567);
cli.addPropertyChangeListener(server);
new Thread(cli).start();
}
}
公共类 CLI 实现 Runnable{
private Scanner scanner;
private String userInput;
private PropertyChangeSupport pcs;
private Boolean serverIsRunning;
public CLI(InputStream in, OutputStream out){
this.scanner = new Scanner(in);
pcs = new PropertyChangeSupport(this);
serverIsRunning = false;
}
@Override
public void run() {
while (true) {
System.out.println("pls enter your command:");
userInput = scanner.nextLine().trim().toUpperCase();
switch (userInput) {
case "START":
if (!serverIsRunning) {
pcs.firePropertyChange(userInput, null, "START");
new Thread(new Server(34567)).start();
serverIsRunning = true;
} else {
System.out.println("server is already running");
}
break;
case "SHUTDOWN":
if (serverIsRunning) {
pcs.firePropertyChange(userInput, null, "SHUTDOWN");
serverIsRunning = false;
} else {
System.out.println("server is not running");
}
break;
}
}
}
public void addPropertyChangeListener(PropertyChangeListener pcl){
this.pcs.addPropertyChangeListener(pcl);
}
public void removePropertyChangeListener(PropertyChangeListener pcl){
this.pcs.removePropertyChangeListener(pcl);
}
}
公共类Server实现Runnable、PropertyChangeListener {
private int port;
private ServerSocket server;
private String userInput = "";
private Boolean serverIsRunning;
public Server(int port) {
this.port = port;
serverIsRunning = true;
}
public void propertyChange(PropertyChangeEvent evt) {
userInput = evt.getNewValue().toString();
switch (userInput) {
case "START":
System.out.println("Starting server...");
serverIsRunning = true;
break;
case "SHUTDOWN":
serverIsRunning = false;
break;
}
}
@Override
public void run() {
try {
server = new ServerSocket(port);
} catch (IOException e) { }
while (serverIsRunning) {
try {
new Thread(new Client(server.accept())).start();
} catch (IOException e) { }
}
try {
server.close();
System.out.println("shutdown");
} catch (IOException e) {
e.printStackTrace();
}
}
}
【问题讨论】:
-
“它只是想摆脱循环”。
while(true),你期待什么? -
使用侦听器结构的主要目的之一是通知对象状态更改,因此不需要或使用 while 循环来轮询状态更改。正确的解决方案是摆脱那个while循环。
-
我不是指主要的那个
-
我的意思是Listener类中的那个
-
@HovercraftFullOfEels 你是对的,我很抱歉。 @Koby,您的 while 循环将无限运行,因为
run()将输入一次并且条件将始终为真。如果您在listenToChange = evt.getNewValue().toString();之后添加对run()的调用,这可能会起作用,但如前所述,这只是糟糕的设计,因为您最终将有许多线程运行无限循环,请遵循气垫船答案的建议以充分利用豆类
标签: java inotifypropertychanged