-1

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

4

1 回答 1

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 Concurrency 包:

关于那个的Avesome书

好文章

于 2013-01-25T09:07:19.480 回答