取消BufferedReader的readLine()
Cancel BufferedReader's readLine()
我写了一个无限循环,我想在其中每 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();
}
这看起来是一个生产者-消费者类型的问题,我会以完全不同的方式构造它,因为这个 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()
,因为这样做很危险。还要避免扩展线程。
我写了一个无限循环,我想在其中每 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();
}
这看起来是一个生产者-消费者类型的问题,我会以完全不同的方式构造它,因为这个 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()
,因为这样做很危险。还要避免扩展线程。