IO阻塞时怎么检查判定循环flag变量的值啊?
public static void main(String[] args) throws IOException{
serverSocket = new ServerSocket(9001);
Socket socket = serverSocket.accept();
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader typing = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Connected to client");
new Thread(new Runnable() {
@Override
public void run(){
while(!endOfSession){
try{
//就是这里,当用户输入over时,直接结束本次会话。但是readLine()会阻塞直至控制台输入换行符,然后才能检查///endOfSession,有什么办法当endOfSession变为true时直接跳出循环的吗?
String line = typing.readLine();
printWriter.println("Server: "+line);
}
catch (IOException e){
}
System.out.println("Enter input finished");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try{
String info = bufferedReader.readLine();
if(info!=null)
System.out.println(info);
else break;
}
catch (IOException e){
endOfSession = true;
System.out.println("The socket is closed!");
break;
}
}
}
}).start();
}
我写的一个简单地对socket对话程序,服务器端和客户端代码几乎没区别。服务器accept()后,创建两个线程,一个不断从键盘读标准输入并打印给客户端,另一个不断从socket读输入打印到控制台。当客户端断开连接时,第二个线程可以直接over,并改变第一个线程循环条件变量的值,但是第一个线程始终在等待用户输入,只有输入换行符后,才会再判端循环条件。有什么办法让线程一在等待用户输入时也可以得知socket已经关闭了吗?
serverSocket = new ServerSocket(9001);
Socket socket = serverSocket.accept();
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader typing = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Connected to client");
new Thread(new Runnable() {
@Override
public void run(){
while(!endOfSession){
try{
//就是这里,当用户输入over时,直接结束本次会话。但是readLine()会阻塞直至控制台输入换行符,然后才能检查///endOfSession,有什么办法当endOfSession变为true时直接跳出循环的吗?
String line = typing.readLine();
printWriter.println("Server: "+line);
}
catch (IOException e){
}
System.out.println("Enter input finished");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try{
String info = bufferedReader.readLine();
if(info!=null)
System.out.println(info);
else break;
}
catch (IOException e){
endOfSession = true;
System.out.println("The socket is closed!");
break;
}
}
}
}).start();
}
我写的一个简单地对socket对话程序,服务器端和客户端代码几乎没区别。服务器accept()后,创建两个线程,一个不断从键盘读标准输入并打印给客户端,另一个不断从socket读输入打印到控制台。当客户端断开连接时,第二个线程可以直接over,并改变第一个线程循环条件变量的值,但是第一个线程始终在等待用户输入,只有输入换行符后,才会再判端循环条件。有什么办法让线程一在等待用户输入时也可以得知socket已经关闭了吗?
...全文
相关推荐
WINDOWS下的非阻塞IO
**文件操作的非阻塞化**:通过设置`CreateFile`函数中的`dwFlagsAndAttributes`参数为`FILE_FLAG_OVERLAPPED`,可以使得对文件的读写操作变为非阻塞模式
Linux设备驱动编程之阻塞与非阻塞
**非阻塞操作**则是指当执行某一操作时,即使当前条件不满足,也不会使进程或线程被挂起,而是立即返回一个错误或特定值。这样做的好处是不会让进程长时间处于等待状态,从而可以提高系统的响应速度和整体效率。
服务器编程-重叠IO原理
如果该函数的bWait参数为true,那么改函数就会阻塞线程直到目标I/O处理完成为止;如果bWait为false,那么就会立即返回,如果此时的I/O尚未完,调用GetLastError就会返回ERROR_IO_INCOMPLETE
面试官:如何终止线程?有几种方式?
目标线程在执行过程中,尤其是阻塞在IO操作或者`wait()`、`sleep()`等方法时,会检测到中断状态并抛出`InterruptedException`。
Java线程关闭的3种方法
我们可以使用一个volatile的布尔变量来标志线程是否应该继续运行。当我们想关闭线程时,只需要将这个变量设置为false即可。


Java SE
