假设我有System.in
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
result = br.readLine();
while (!result.isEmpty()) {
if (result.equalsIgnoreCase("exit")) {
userStr="exit";
System.exit(0);
} else if (result.equalsIgnoreCase("list")) {
userStr="list";
} else if (result.equalsIgnoreCase("kill")) {
userStr="kill";
} else if (result.equalsIgnoreCase("help")) {
userStr="help";
}
和
ServerSocket socketListener = new ServerSocket(port);
while (true) {
Socket client = socketListener.accept();
new ServerThread(client,userStr); //pass userStr to Thread
}
我不明白我怎么能“等待控制台命令”并将它们传递给活动的线程。我需要接受()客户端,将它们传递给线程。如果我在服务器控制台中输入了一个命令,例如; “kill Username”(断开用户)或“list”(用户名列表) 我的服务器应该将命令传递给线程。
p / s我需要管理服务器,通过输入控制台命令来实现管理。
答案 0 :(得分:2)
作为简单的解决方案,您可以阻止线程直到它将收到要执行的任务:
class Task implements Runnable {
AtomicReference<String> atomicReference = new AtomicReference<String>(null);
@Override
public void run() {
while (true) {
String command = atomicReference.getAndSet(null);
if (command != null) {
//do staff with command
}
}
}
public void executeCommand(String command) {
atomicReference.set(command);
}
}
像这样使用:
ServerSocket socketListener = new ServerSocket(port);
Task task = new Task();
new Thread(task).start();
while (true) {
Socket client = socketListener.accept();
task.executeCommand(userCommand);
}
但如果您需要更复杂的解决方案,我可以建议您阅读有关Java并发包的信息: