Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099

[Concurrency] Объяснить программный ввод Enter

23.08.2017, 19:02. Показов 646. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть пример, объясняющий моделирование ввода Enter через 3 секунд после старта программы, для того, чтобы завершить выполнение потока
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class Test extends Thread {
    public void run() {
        while (true) {
            try {
                System.out.println("Demon works");
                Thread.sleep(300);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }
    public static void main(String[] args) throws Exception {
        Test t = new Test();
        t.setDaemon(true);
        t.start();
 
        new Thread() {
            public void run() {
                byte[] buffer = new byte[10];
                int count;
                try {
                    do {
                        while ((count = System.in.read(buffer)) == -1);
                    } while (!System.lineSeparator().equals(new String(buffer, 0, count)));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                System.out.println("ENTER has been obtained");
            }
        }.start();
    }
}
public class Main {
    public static void main(String[] args) throws Exception {
        // save standard input
        InputStream stdIn = System.in;
 
        // create input stream with line terminator (=ENTER)
        ByteArrayInputStream bais = new
                ByteArrayInputStream(System.lineSeparator().getBytes());
 
        // move internal pointer of input stream to the end of input
        bais.skip(System.lineSeparator().length());
        
        // assign new value of standard input
        System.setIn(bais);
        // main functionality
        Test.main(args);
 
        // waith for 3 sec
        Thread.sleep(3000);
        System.out.println("Try to send enter to standard input");
        // move internal pointer to begin of input
        bais.reset();
        // restore standard input
        System.setIn(stdIn);
    }
}
Мне понятны Test#run() и Main#main(), но совсем непонятно, что происходит в Test#main(). Объясните, кто-нибудь, что там за буфер, почему он именно такого размера, что делают циклы. И самое главное, почему поток останавливается?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.08.2017, 19:02
Ответы с готовыми решениями:

Ввод символа в консоль без нажатия enter
Программа должна считывать символ не дожидаясь нажатия enter. Как это можно реализовать?

Закрыть ввод без нажатия enter, возможно ли?
Подскажите, возможно ли это? Консольнный ввод элементов массива в одну строку. После того как я ввел количество элементов, равное...

Concurrency vs Асинхронность: объяснить простым языком отличия
Может кто-нибудь объяснить более простым языком в чём отличие конкурентности (Concurrency) от асинхронности, или же это \pm одно и тоже?

1
34 / 30 / 10
Регистрация: 24.11.2014
Сообщений: 188
Записей в блоге: 12
24.08.2017, 00:03
Внутренний цикл while пытается прочитать данные из потока в буфер. Если удалось прочитать в буфер какое-то количество байт, то проверяется пост условие цикла do-while, которое состоит в сравнении прочитанного буфера с символом перевода на новую строку. Как только это условие выполнится, этот цикл завершится, а следовательно завершится и поток. Как-то так.

На мой взгляд, условие выхода из цикла немного странное. Если в поток будут писаться какие-то еще символы кроме перевода строки оно может и не сработать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.08.2017, 00:03
Помогаю со студенческими работами здесь

Логически объяснить программный код С#
(суть программы в том, чтобы справа от числа введенное пользователем правильно писалось слово рубль, то бишь, 1 = рубль, 2 = рубля, 5 =...

Объяснить программный код метода Ньютона
Как происходит решение метода Ньютона программным языком? Непонятно с 6 по 8 строку //метод касательных(Ньютона) if...

Программный ввод даты
Здравствуйте! Подскажите, пожалуйста! Хочу добавить данные в таблицу, но не знаю как добавить данные типа date. Вот код: ...

Программный ввод на основании
Платформа - 7.7 Простите за, наверное, ламерский вопрос. Есть документ, на основании его можно ввести несколько видов других документов. ...

Программный ввод из файла
Нужно программно(без участия пользователя) открыть файл с расширением .dat и извлечь из него данные по следующей схеме: в первой строке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru