public class Foo {
public static void main(String[] args) throws Exception {
while(System.in.available() == 0) {
System.out.println("foo");
Thread.sleep(1000);
}
}
}
работает, но (в Linux) только после нажатия "return", потому что входной поток консоли буферизуется и определяется ОС. Это означает, что вы не можете преодолеть это, используя Каналы или любой другой класс NIO. Чтобы убедиться, что консоль очищает каждый символ, вам необходимо изменить настройки терминала. Я однажды написал программу на C, которая делает это (измените флаг ICANON структуры termios текущего терминала), но я не знаю, как это сделать с Java (но см. вторая ссылка).
В общем, вы можете найти еще кое-что в этом выпуске поиск для "неблокируемого ввода java".