我写了一个无限循环,我想每5秒发送一次用户消息。因此,我编写了一个线程,等待5秒钟,然后发送readLine()方法接收到的消息。如果用户不提供任何输入,则由于readLine()方法正在等待输入,因此循环不会继续进行。那么如何取消readLine()方法?
while (true) {
new Thread() {
@Override
public void run() {
try {
long startTime = System.currentTimeMillis();
while ((System.currentTimeMillis() - startTime) < 5000) {
}
toClient.println(serverMessage);
clientMessage = fromClient.readLine();
System.out.println(clientName + ": " + clientMessage);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
serverMessage = input.readLine();
}
答案 0 :(得分:1)
这似乎是生产者-消费者类型的问题,由于这个fromClient.readLine();
正在阻塞,因此应该在另一个线程中执行,因此我将以完全不同的方式构造它。
因此,请考虑将另一个线程中的用户输入读入数据结构(例如Queue<String>
之类的LinkedBlockingQueue<String>
中,然后每隔5秒从代码队列中检索String元素,否则不进行任何操作如果队列中没有任何元素。
类似....
new Thread(() -> {
while (true) {
try {
blockingQueue.put(input.readLine());
} catch (InterruptedException | IOException e) {
e.printStackTrace();
}
}
}).start();
new Thread(() -> {
try {
while (true) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
String input = blockingQueue.poll();
input = input == null ? "" : input;
toClient.println(input);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
旁注:请勿在线程上调用.stop()
,因为这样做很危险。还要避免扩展Thread。