-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               
            }

「コンソールコマンドを待って」アクティブなスレッドに渡す方法がわかりません。クライアントをaccept()して、スレッドに渡す必要があります。たとえば、サーバーコンソールにコマンドを入力した場合。「killUsername」(ユーザーの切断)または「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同時実行パッケージについて読むことをお勧めします。

それについての素晴らしい本

良い記事

于 2013-01-25T09:07:19.480 に答える