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

由于java中的某些条件,如何调用函数来延迟执行?,java,multithreading,Java,Multithreading,这是我的run方法,它打开一个套接字,等待接受的连接,如果连接被接受,将打开一个单独的线程来执行它: while (isKeepRun) { socket = serverSocket.accept(); WorkTask worktask = new WorkTask(); worktask.setSocket(socket); worktask.setIn(new ObjectInputStream(socket.getInputStream()));

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

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等待工作线程完成,然后主线程将完成。但对于客户端套接字,您只有一个引用。即使等待,也只能等待最后一个套接字完成。如果您将上一个客户端套接字设置为停止,则它将关闭。

是的,它可以加入,但加入后,当新消息推送到套接字时,它无法接收…这意味着只有一个工作任务正在运行…是的,它可以加入,但在加入后,当新消息推送到套接字时,它无法接收…这意味着只有一个工作任务正在运行。。。。