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

标签 java multithreading

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

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/

相关文章:

java - Selenium 测试 - Firefox 警报立即消失

java - 为什么 fopen 由于 Android-NDK 应用程序的权限问题而在 native 方法中失败?

java - @AuthenticationPrincipal 抛出异常

java - 例如,调用 notifyAll 的顺序如何影响 Java 中的执行?

java - 使用java的简单多线程服务器聊天

java - 字符串对象计数 SCJP

java - 查询生成器中的 JPA 2.0 谓词条件列表

用于带代理支持的多线程蜘蛛的 Python 包?

c - 如何在 C 中创建一个非常基本的线程函数

c++ - 在线程中调用时 memcpy 变慢