gpt4 book ai didi

java - 由于java中的某些条件,我如何调用一个函数来延迟执行?

转载 作者:行者123 更新时间:2023-11-30 07:27:25 25 4
gpt4 key购买 nike

这是我的运行方法,它打开一个套接字,并等待接受的连接,如果接受连接,将打开一个单独的线程来执行它:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com