java thread System.in我怎么能“等待控制台命令”

时间:2013-01-25 08:38:20

标签: java console command serversocket

假设我有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我需要管理服务器,通过输入控制台命令来实现管理。

1 个答案:

答案 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并发包的信息:

Avesome book about that

Good article