这是我的运行方法,它打开一个套接字,并等待接受的连接,如果连接被接受,将有一个单独的线程打开来执行它:
while (isKeepRun) {
socket = serverSocket.accept();
WorkTask worktask = new WorkTask();
worktask.setSocket(socket);
worktask.setIn(new ObjectInputStream(socket.getInputStream()));
worktask.setOut(new ObjectOutputStream(socket.getOutputStream()));
Thread wt = new Thread(worktask);
wt.start();
}
if (socket != null) {
socket.close();
}
if (serverSocket != null) {
serverSocket.close();
}
当用户调用它来停止时,他们调用此方法来更改 while 循环条件。为了打破 while 循环:
public void stopWorking() {
isKeepRun = false;
}
嗯,WorkTask 的 run 方法非常简单:
try {
do {
objectOutputStream.flush();
receivedObj = objectInputStream.readObject();
if (receivedObj != null){
System.out.println(receivedObj.toString()+" " + receivedObj.hashCode());
}
} while (receivedObj != null
&& !receivedObj.equals(SharedConstant.SOCKET_EOF_STRING));
if (objectInputStream != null) {
objectInputStream.close();
}
if (objectOutputStream != null) {
objectOutputStream.close();
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
问题是假设读取一条消息每条消息需要 1 秒,用户可能会放弃最多 100 条消息,这意味着它需要 100 秒在套接字中运行。当isKeepRun
保持运行时,没有问题。但是当用户想要停止并调用 stopWorking 时,循环将被转义,可以在 WorkTask 读取消息期间关闭套接字。如果套接字仍在读取,如果套接字已完成读取,则如何延迟执行 stopWorking
,并且 stopWorking
将立即被调用,但如果套接字不这样做没有任何东西要读,我可以立即调用 stopWorking
吗?
谢谢。
最佳答案
如果您的工作线程正在处理您的客户端请求,那么关闭套接字连接应该是他的责任。您应该将关闭接受的套接字的代码移至工作线程中。您的服务器套接字接受循环将是独立的,并且一旦发出关闭请求就会关闭。但是,现有连接仍然有效,工作线程可以继续处理它们。
关于java - 由于java中的某些条件,如何调用函数来延迟执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9734121/