Взлом на пользовательский ввод без задержки в Java? - PullRequest
0 голосов
/ 28 июня 2011

У меня есть цикл while, который читает из сокета , и вместо таймера я хочу разорвать, закрыть сокет и завершить программу при вводе пользователем, но яне хотите, чтобы пользователь вводил «1», «продолжить» или «что-то» для каждого чтения.Я просто хочу, если есть вход от пользователя, разорвать и закрыть, в противном случае, если нет помех, продолжить.Я боюсь, что мне придется использовать таймер , что я не хочу делать, потому что это задержит прием из сокета, и мне нужно иметь небольшую или никакую задержку, если это возможно.

Есть ли какая-нибудь функция Java, которая делает это, или простое решение, которое мне не хватает?

РЕДАКТИРОВАТЬ:

Я не хочу ждатьпользовательский ввод.Я просто хочу продолжить, если пользовательский ввод не обнаружен, но дело в том, что нет никаких задержек в проверке, чтобы убедиться, что пользователь что-то ввел.Я запускаю программу, предполагая, что она должна просто продолжаться, пока пользователь не скажет иначе.

Ответы [ 6 ]

1 голос
/ 28 июня 2011

Вы, вероятно, хотите две темы.

Один поток должен прочитать пользовательский ввод и поместить эту «команду» в переменную, которая используется совместно с другим потоком.

Второй поток должен обрабатывать «команды» из этой переменной (вы, вероятно, хотите построить очередь команд). Этот поток должен ожидать размещения команд в очереди.

Переменная (вероятно, очередь), содержащая команды, должна быть защищена синхронизированным блоком. Второй поток должен ждать () для объекта, на котором выполняется синхронизация, и первый поток должен запускать notify () для этого объекта, когда он поместил туда команду.

Затем второй поток может обрабатывать команды и реагировать на них, не дожидаясь ввода пользователя (если есть команды для обработки), и сразу же просыпается, когда есть что сделать.

1 голос
/ 28 июня 2011

Вы можете сделать isReady для входного потока, чтобы посмотреть, есть ли там какие-либо данные. В простейшем случае вы могли бы спать в течение указанного времени, затем проверить isReady и продолжить или прервать, как требуется. Если вы хотите немедленно ответить, когда пользователь отправляет сигнал отмены, у вас может быть цикл, который продолжает проверять isReady и сверять текущее время с начальным временем и прерывается при выполнении любого условия. Если есть какая-то другая работа, которую вы хотите выполнить, ожидая этого, вы можете поместить ее в отдельный поток. (В этом случае цикл должен включать yield (), чтобы другие вещи могли происходить.)

1 голос
/ 28 июня 2011

Вам нужно Threading для вашего требования. Откройте новый поток, который читает из сокета, в то время как в вашем основном потоке вы ждете ввода пользователя. Когда вы получите ввод, вы можете прервать другой поток.

Вы можете создать класс Thread, например:

public class ClientThread extends Thread {
    private String address;
    private int port;

    ClientThread(String address, int port) {
        this.address = address;
        this.port = port;
    }

    public void run() {
        // connect to socket and start reading
        . . .
    }
}

А затем используйте его в своем приложении с:

ClientThread c = new ClientThread("127.0.0.1", 4547);
c.start();
1 голос
/ 28 июня 2011

Как насчет привязки прослушивателя событий к вашему входу, и если есть вход, который вы обрабатываете (в этом случае закройте соединение сокета)

У вас есть «похожий» образец здесь

РЕДАКТИРОВАТЬ: Не полностью прочитал ваш вопрос. Думаю, у вас есть какой-то графический интерфейс. Так как вы этого не сделаете, вы можете сделать что-то подобное (не использовать потоки в Java некоторое время, так что это «псевдокод», но я надеюсь, что вы получите картину):

public void start()
{
        Console console = System.console();
        if (console != null)
        {
                Thread th = new Thread(yourWorkerClass);
                th.run();

                //blocking
                String readLine = console.readLine("Do something: ", (Object[])null);
                th.stopYourWorkMethod(); 

        }
}
1 голос
/ 28 июня 2011

Лучший способ сделать это, вероятно, запустить поток, который ожидает ввода данных пользователем.если это обнаружено, поток может установить флаг, который проверяется внутри цикла.

1 голос
/ 28 июня 2011

Я думаю, что я решил, что вы хотите указать период ожидания?Вы можете установить время ожидания, вызвав в Socket метод setSoTimeout(int timeout), вы также можете указать его через конструктор Socket.См. Socket API здесь

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...