一个被阻止的java线程的方法可以被另一个线程执行吗?

时间:2010-09-17 13:09:29

标签: java multithreading

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

3 个答案:

答案 0 :(得分:1)

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

也就是说,其他客户端线程可以调用一个logout方法来操作来自自己线程的共享数据结构。您可能希望为此考虑并发方法,或者在服务器线程上使用NIO和非阻塞IO。

答案 1 :(得分:1)

线程是一个执行流程。你在这里有多个。连接接受线程在accept()中被阻止。如果我理解正确,“客户端”线程已经启动并正在处理与已连接客户端的对话。我猜测“在服务器线程上调用logout方法”你的意思是“在上调用logout()方法,它也有login()方法”。由于“客户端”线程会这样做,所以应该没问题,除非login()logout()没有为某个地方的同一个锁而战。

答案 2 :(得分:0)

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

我为聊天服务器提供了这样的代码:

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

处理程序现在会尝试验证客户端。

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

相关问题