【问题标题】:can a blocked java thread's method be executed by another thread?阻塞的java线程的方法可以被另一个线程执行吗?
【发布时间】:2010-09-17 13:09:28
【问题描述】:

计划创建一个带有登录(接受新客户端并创建处理它们的线程)和注销方法的服务器线程。 login 方法将被 socket.accept() 方法阻塞以等待客户端。如果服务器线程被其他方法阻塞,其他想要注销的客户端是否能够在服务器线程上调用 logout 方法?

【问题讨论】:

  • 提供一些代码怎么样。
  • 请澄清您的问题。线程没有方法。 Thread 类的实例和正在运行的线程是两个截然不同的东西。

标签: java multithreading


【解决方案1】:

线程是一个执行流。你在这里有多个。连接接受线程在accept() 中被阻塞。如果我理解正确,“客户端”线程已经启动并正在处理与连接客户端的对话。我猜“在服务器线程上调用注销方法”实际上是指“在类上调用logout() 方法,它也有login() 方法”。由于“客户端”线程将执行此操作,因此应该没问题,除非 login() 和 logout() 没有在某处争夺同一个锁。

【讨论】:

    【解决方案2】:

    没有。如果一个线程被阻塞,它进行任何额外处理的唯一方法是唤醒并继续执行。

    也就是说,其他客户端线程可以调用注销方法,从他们自己的线程中操作共享数据结构。您可能想为此研究并发方法,或者在服务器线程上使用 NIO 和非阻塞 IO。

    【讨论】:

      【解决方案3】:

      我认为你应该在一个线程中使用 accept ,它只会创建一个 ThreadHandler 并将这个连接添加到它,ThreadHandle 是另一个线程,它将登录用户然后做任何你想做的事情。

      我有一个类似这样的代码用于聊天服务器:

      while(true)
      {
      Socket clientSocket = server.accept();
      ClientThreadHandler c = new ClientThreadHandler(clientSocket);
      server.addClientThread(c);
      }
      

      处理程序现在将尝试对客户端进行身份验证。

      也可以很好地实现一个心跳,在该心跳中,服务器将向已连接且经过身份验证的客户端发送一个数据包,检查客户端是否仍然运行。如果没有,服务器将关闭连接。 ThreadHandler 将始终监听客户端请求并处理它们。 不要忘记同步从不同线程访问的方法。

      【讨论】:

        猜你喜欢
        • 2015-07-06
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 2020-11-10
        • 2012-01-25
        相关资源
        最近更新 更多