由于java中的某些条件,如何调用函数来延迟执行?
这是我的run方法,它打开一个套接字,等待接受的连接,如果连接被接受,将打开一个单独的线程来执行它:由于java中的某些条件,如何调用函数来延迟执行?,java,multithreading,Java,Multithreading,这是我的run方法,它打开一个套接字,等待接受的连接,如果连接被接受,将打开一个单独的线程来执行它: while (isKeepRun) { socket = serverSocket.accept(); WorkTask worktask = new WorkTask(); worktask.setSocket(socket); worktask.setIn(new ObjectInputStream(socket.getInputStream()));
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的执行
谢谢。您可以通过调用isAlive方法来检查周围是否还有活动的工作线程。为此,您需要使用一些列表或地图来跟踪您的员工 您还可以为工作人员使用回调机制,通过该机制,他们可以在完成任务后进行报告。在停止之前,您只需检查是否每个工作人员都已完成 在这两种情况下,如果仍有活动的工作线程,请睡眠一段时间,然后再次检查,直到所有线程都完成 编辑:
Vikas Nalwar提出了一个很好的观点,让工人们关闭插座连接。不过,等待工作线程完成仍然是一个好主意。您可以通过调用其isAlive方法来检查周围是否仍有活动的工作线程。为此,您需要使用一些列表或地图来跟踪您的员工 您还可以为工作人员使用回调机制,通过该机制,他们可以在完成任务后进行报告。在停止之前,您只需检查是否每个工作人员都已完成 在这两种情况下,如果仍有活动的工作线程,请睡眠一段时间,然后再次检查,直到所有线程都完成 编辑: Vikas Nalwar提出了一个很好的观点,让工人们关闭插座连接。不过,最好还是等待工作线程完成。尝试添加
wt.join()
在wt.start之后。这将等待线程完成其执行。尝试添加
wt.join()
在wt.start之后。这将等待线程完成其执行。如果您的工作线程正在处理您的客户端请求,那么关闭套接字连接应该是他的责任。您应该将关闭已接受套接字的代码移动到工作线程中。您的服务器套接字接受循环将是独立的,并将在发出关闭请求后立即关闭。但是,现有连接仍然有效,工作线程可以继续处理这些连接。如果工作线程正在处理客户端请求,则应负责关闭套接字连接。您应该将关闭已接受套接字的代码移动到工作线程中。您的服务器套接字接受循环将是独立的,并将在发出关闭请求后立即关闭。但是,现有连接仍然有效,工作线程可以继续处理它们。代码中有一个问题: 而伊斯基普{
socket = serverSocket.accept();
....
}
如果是插座!=空的{
socket.close();
}
对于所有客户端套接字,只使用一个套接字引用。因此,如果有多个客户端套接字,那么您将只关闭最后一个套接字
如上所述,您可以使用wt.join等待工作线程完成,然后主线程将完成。但对于客户端套接字,您只有一个引用。即使等待,也只能等待最后一个套接字完成。如果将以前的客户端套接字设置为“停止”,则将关闭所有客户端套接字。代码中存在问题: 而伊斯基普{
socket = serverSocket.accept();
....
}
如果是插座!=空的{
socket.close();
}
对于所有客户端套接字,只使用一个套接字引用。因此,如果有多个客户端套接字,那么您将只关闭最后一个套接字
如上所述,您可以使用wt.join等待工作线程完成,然后主线程将完成。但对于客户端套接字,您只有一个引用。即使等待,也只能等待最后一个套接字完成。如果您将上一个客户端套接字设置为停止,则它将关闭。是的,它可以加入,但加入后,当新消息推送到套接字时,它无法接收…这意味着只有一个工作任务正在运行…是的,它可以加入,但在加入后,当新消息推送到套接字时,它无法接收…这意味着只有一个工作任务正在运行。。。。