Говоря мое требование: Любой пользователь вводит что-то в консоли (из system.in) или сокет что-то получает, переходите к следующему шагу.Может java system.in работать вместе с исходным исходным кодом в то же время без использования нити
Поэтому у меня есть сканер
Scanner sc = new Scanner(System.in);
У клиента UdP. (Другой источник входного сигнала)
DatagramSocket clientSocket = new DatagramSocket();
Мой код
while (true) {
if (sc.hasNext()) {
String str = sc.next();
proceed(str)
} else {
clientSocket.receive(pack);
proceed(pack)
}
}
Очевидно, что этот код не будет работать. Потому что при проверке sc.hasNext() java ожидает, что пользователь наберет некоторый ввод в консоли. В настоящее время я могу открыть поток для Udp-клиента. Если изменить порядок,
while (true) {
clientSocket.receive(pack);
if (not receive) read from system.in
}
Это не имеет смысла, так как получить() будет ждать Util получить что-то, он никогда не будет читать System.in одновременно.
Так как я могу достичь своего требования без использования нити?
Вдохновленный ответ @Andriy Kryvtsun, я сделал быстрый тест По его словам, это как-то с помощью неблокируемому чтения, и держать давая тайм-аут сокета, чтобы эмулировать
InputStream ins = System.in;
byte buffer[] = new byte[512];
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
DatagramSocket clientSocket = new DatagramSocket();
System.out.println("From buffer:" + clientSocket.getLocalPort());
while (true) {
try {
if (ins.available() > 0) {
String line = reader.readLine();
System.out.println("Read:" + line);
} else {
DatagramPacket pack = new DatagramPacket(buffer,buffer.length);
clientSocket.setSoTimeout(2000);
clientSocket.receive(pack);
System.out.println("Receive: " + new String(pack.getData()));
}
} catch (IOException e1) {
}
}
System.in - это блокирующий поток, поэтому нет предела тому, как долго он может блокироваться. Для обработки Socket вам нужно использовать поток (или два). –
Похоже, вы можете использовать что-то из пакета 'java.nio.channels', но я не знаю, что именно, потому что я никогда не использовал его сам. Я бы использовал потоки для решения проблемы, которую вы описываете. –
Да. Я также нашел те неблокирующие вещи. Поскольку требование не использовать поток. Я должен найти неблокирующий способ. – TTTTTAAOOOO